~kubuntu-members/korundum/4.11

« back to all changes in this revision

Viewing changes to plasma/examples/applets/analog-clock/clock.rb

  • Committer: Ian Monroe
  • Date: 2010-11-21 15:55:01 UTC
  • Revision ID: git-v1:c37670e4e3c59f5eb2ba112f5341a5e706217f6f
Split up Smoke into Qt and KDE directories. 
Move libsmoke stuff into the generator directory
Split up Ruby into qtruby and korundum directories

svn path=/trunk/KDE/kdebindings/ruby/; revision=1199320

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
=begin
2
 
/***************************************************************************
3
 
 *   Copyright (C) 2005,2006,2007 by Siraj Razick                          *
4
 
 *   siraj@kdemail.net                                                     *
5
 
 *                                                                         *
6
 
 *   Translated to Ruby by Richard Dale                                    *
7
 
 *                                                                         *
8
 
 *   This program is free software; you can redistribute it and/or modify  *
9
 
 *   it under the terms of the GNU General Public License as published by  *
10
 
 *   the Free Software Foundation; either version 2 of the License, or     *
11
 
 *   (at your option) any later version.                                   *
12
 
 *                                                                         *
13
 
 *   This program is distributed in the hope that it will be useful,       *
14
 
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
15
 
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
16
 
 *   GNU General Public License for more details.                          *
17
 
 *                                                                         *
18
 
 *   You should have received a copy of the GNU General Public License     *
19
 
 *   along with self program; if not, write to the                         *
20
 
 *   Free Software Foundation, Inc.,                                       *
21
 
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
22
 
 ***************************************************************************/
23
 
=end
24
 
 
25
 
require 'plasma_applet'
26
 
require 'analog_clock_config'
27
 
require 'timezones_config'
28
 
require 'calendar'
29
 
require 'clockapplet'
30
 
 
31
 
module PlasmaAppletRubyClock
32
 
 
33
 
class Clock < ClockApplet
34
 
 
35
 
  slots :moveSecondHand, :configAccepted, 
36
 
        'dataUpdated(QString, Plasma::DataEngine::Data)'
37
 
 
38
 
  def initialize(parent, args = nil)
39
 
    super
40
 
    KDE::Global.locale.insertCatalog("libplasmaclock")
41
 
 
42
 
    setHasConfigurationInterface(true)
43
 
    resize(125, 125)
44
 
    setAspectRatioMode(Plasma::Square)
45
 
 
46
 
    @theme = Plasma::Svg.new(self)
47
 
    @theme.imagePath = "widgets/clock"
48
 
    @theme.containsMultipleImages = false
49
 
    @theme.resize(size())
50
 
 
51
 
    @timezone = ""
52
 
    @showTimeString = false
53
 
    @showSecondHand = false
54
 
    @ui = Ui::AnalogClockConfig.new
55
 
    @calendarUi = Ui::Calendar.new
56
 
 
57
 
    @lastTimeSeen = Qt::Time.new
58
 
    @calendar = 0
59
 
    @time = Qt::Time.new
60
 
  end
61
 
 
62
 
  def init
63
 
    cg = config()
64
 
    @showTimeString = cg.readEntry("showTimeString", false)
65
 
    @showSecondHand = cg.readEntry("showSecondHand", false)
66
 
    @fancyHands = cg.readEntry("fancyHands", false)
67
 
    self.currentTimezone = cg.readEntry("timezone", localTimezone())
68
 
 
69
 
    connectToEngine()
70
 
  end
71
 
 
72
 
  def connectToEngine
73
 
    # Use 'dataEngine("ruby-time")' for the ruby version of the engine
74
 
    timeEngine = dataEngine("time")
75
 
    if @showSecondHand
76
 
        timeEngine.connectSource(currentTimezone(), self, 500)
77
 
    else 
78
 
        timeEngine.connectSource(currentTimezone(), self, 6000, Plasma::AlignToMinute)
79
 
    end
80
 
  end
81
 
 
82
 
  def constraintsEvent(constraints)
83
 
    if constraints.to_i & Plasma::FormFactorConstraint.to_i
84
 
      setBackgroundHints(NoBackground)
85
 
    end
86
 
 
87
 
    if constraints.to_i & Plasma::SizeConstraint.to_i
88
 
        @theme.resize(size())
89
 
    end
90
 
  end
91
 
 
92
 
  def shape
93
 
    if @theme.hasElement("hint-square-clock")
94
 
        return super
95
 
    end
96
 
 
97
 
    path = Qt::PainterPath.new
98
 
    path.addEllipse(boundingRect().adjusted(-2, -2, 2, 2))
99
 
    return path
100
 
  end
101
 
 
102
 
  def dataUpdated(source, data)
103
 
    @time = data["Time"].toTime()
104
 
    if @time.minute == @lastTimeSeen.minute &&
105
 
      @time.second == @lastTimeSeen.second
106
 
      # avoid unnecessary repaints
107
 
      return
108
 
    end
109
 
 
110
 
    if @secondHandUpdateTimer
111
 
        @secondHandUpdateTimer.stop
112
 
    end
113
 
 
114
 
    @lastTimeSeen = @time
115
 
    update()
116
 
  end
117
 
 
118
 
  def createClockConfigurationInterface(parent)
119
 
    # TODO: Make the size settable
120
 
    widget = Qt::Widget.new
121
 
    @ui.setupUi(widget)
122
 
    parent.addPage(widget, KDE.i18n("General"), icon)
123
 
 
124
 
    @ui.showTimeStringCheckBox.checked = @showTimeString
125
 
    @ui.showSecondHandCheckBox.checked = @showSecondHand
126
 
  end
127
 
 
128
 
  def clockConfigAccepted()
129
 
    cg = config()
130
 
    @showTimeString = @ui.showTimeStringCheckBox.checked?
131
 
    @showSecondHand = @ui.showSecondHandCheckBox.checked?
132
 
 
133
 
    cg.writeEntry("showTimeString", @showTimeString)
134
 
    cg.writeEntry("showSecondHand", @showSecondHand)
135
 
    update()
136
 
 
137
 
    dataEngine("time").disconnectSource(currentTimezone(), self)
138
 
    connectToEngine
139
 
 
140
 
    constraintsEvent(Plasma::AllConstraints)
141
 
    emit configNeedsSaving
142
 
  end
143
 
 
144
 
  def changeEngineTimezone(oldTimezone, newTimezone)
145
 
    dataEngine("time").disconnectSource(oldTimezone, self)
146
 
    timeEngine = dataEngine("time")
147
 
    if @showSecondHand
148
 
        timeEngine.connectSource(newTimezone, self, 500)
149
 
    else
150
 
        timeEngine.connectSource(newTimezone, self, 6000, Plasma::AlignToMinute)
151
 
    end
152
 
  end
153
 
 
154
 
  def moveSecondHand
155
 
    update
156
 
  end
157
 
 
158
 
  def drawHand(p, rotation, handName)
159
 
    p.save
160
 
    boundSize = boundingRect.size
161
 
    elementRect = @theme.elementRect(handName)
162
 
 
163
 
    p.translate(boundSize.width() / 2, boundSize.height() / 2)
164
 
    p.rotate(rotation)
165
 
    p.translate(-elementRect.width / 2, -(@theme.elementRect("clockFace").center.y - elementRect.top))
166
 
    @theme.paint(p, Qt::RectF.new(Qt::PointF.new(0.0, 0.0), elementRect.size), handName)
167
 
 
168
 
    p.restore
169
 
  end
170
 
 
171
 
  def paintInterface(p, option, rect)
172
 
    tempRect = Qt::RectF.new(0, 0, 0, 0)
173
 
 
174
 
    boundSize = geometry.size
175
 
 
176
 
    p.renderHint = Qt::Painter::SmoothPixmapTransform
177
 
 
178
 
    minutes = 6.0 * @time.minute - 180
179
 
    hours = 30.0 * @time.hour - 180 + ((@time.minute / 59.0) * 30.0)
180
 
 
181
 
    @theme.paint(p, Qt::RectF.new(rect), "ClockFace")
182
 
 
183
 
    if @showTimeString
184
 
      fm = Qt::FontMetrics.new(Qt::Application.font)
185
 
      margin = 4
186
 
      if @showSecondHand
187
 
        # FIXME: temporary time output
188
 
        time = @time.toString
189
 
      else
190
 
        time = @time.toString("hh:mm")
191
 
      end
192
 
 
193
 
      textRect = Qt::Rect.new((rect.width/2 - fm.width(time) / 2),((rect.height / 2) - fm.xHeight * 4),
194
 
                  fm.width(time), fm.xHeight())
195
 
 
196
 
      p.pen = Qt::NoPen
197
 
      background = Plasma::Theme.defaultTheme.color(Plasma::Theme::BackgroundColor)
198
 
      background.setAlphaF(0.5)
199
 
      p.brush = Qt::Brush.new(background)
200
 
 
201
 
      p.setRenderHint(Qt::Painter::Antialiasing, true)
202
 
      p.drawPath(Plasma::PaintUtils.roundedRectangle(Qt::RectF.new(textRect.adjusted(-margin, -margin, margin, margin)), margin))
203
 
      p.setRenderHint(Qt::Painter::Antialiasing, false)
204
 
 
205
 
      p.pen = Plasma::Theme::defaultTheme.color(Plasma::Theme::TextColor)
206
 
        
207
 
      p.drawText(textRect.bottomLeft, time)
208
 
    end
209
 
 
210
 
    # Make sure we paint the second hand on top of the others
211
 
    if @showSecondHand
212
 
      anglePerSec = 6.0
213
 
      seconds = anglePerSec * @time.second() - 180
214
 
 
215
 
      if @fancyHands
216
 
        if @secondHandUpdateTimer.nil?
217
 
          @secondHandUpdateTimer = Qt::Timer.new(self)
218
 
          connect(@secondHandUpdateTimer, SIGNAL(:timeout), self, SLOT(:moveSecondHand))
219
 
        end
220
 
 
221
 
        if !@secondHandUpdateTimer.active?
222
 
          @secondHandUpdateTimer.start(50)
223
 
          @animationStart = Qt::Time.currentTime.msec
224
 
        else
225
 
          runTime = 500
226
 
          m = 1.0 # Mass
227
 
          b = 1.0 # Drag coefficient
228
 
          k = 1.5 # Spring constant
229
 
          gamma = b / (2 * m) # Dampening constant
230
 
          omega0 = Math.sqrt(k / m)
231
 
          omega1 = Math.sqrt(omega0 * omega0 - gamma * gamma)
232
 
          elapsed = Qt::Time.currentTime().msec() - @animationStart
233
 
          t = (4 * Math::PI) * (elapsed / runTime)
234
 
          val = 1 + exp(-gamma * t) * -Math.cos(omega1 * t)
235
 
 
236
 
          if elapsed > runTime
237
 
            @secondHandUpdateTimer.stop
238
 
          else
239
 
            seconds += -anglePerSec + (anglePerSec * val)
240
 
          end
241
 
        end
242
 
      end
243
 
    end
244
 
 
245
 
    if @theme.hasElement("HourHandShadow")
246
 
        p.translate(1,3)
247
 
 
248
 
        drawHand(p, hours, "HourHandShadow")
249
 
        drawHand(p, minutes, "MinuteHandShadow")
250
 
 
251
 
        if @showSecondHand
252
 
            drawHand(p, seconds, "SecondHandShadow")
253
 
        end
254
 
 
255
 
        p.translate(-1,-3)
256
 
    end
257
 
 
258
 
    drawHand(p, hours, "HourHand")
259
 
    drawHand(p, minutes, "MinuteHand")
260
 
    if @showSecondHand
261
 
        drawHand(p, seconds, "SecondHand")
262
 
    end
263
 
 
264
 
    p.save
265
 
    @theme.resize(boundSize)
266
 
    elementSize = Qt::SizeF.new(@theme.elementSize("HandCenterScrew"))
267
 
    tempRect.size = elementSize
268
 
    p.translate(boundSize.width / 2.0 - elementSize.width / 2.0, boundSize.height / 2.0 - elementSize.height / 2.0)
269
 
    @theme.paint(p, tempRect, "HandCenterScrew")
270
 
    p.restore
271
 
 
272
 
    @theme.paint(p, Qt::RectF.new(rect), "Glass")
273
 
  end
274
 
end
275
 
 
276
 
end