[Sugar-devel] [PATCH] Fixes to the record UI
Aleksey Lim
alsroot at member.fsf.org
Tue Jun 8 15:45:06 EDT 2010
On Wed, Jun 09, 2010 at 12:22:19AM +0530, anishmangal2002 at gmail.com wrote:
> From: anishmangal2002 <anishmangal2002 at gmail.com>
>
> How the existing UI works:
> The record UI consists of many windows/widgets. In a particular
> mode or view, it displays and resizes the widgets appropriate for that
> view and tries to hide the other windows by moving them off-screen.
> Now, on sugar-0.88 (and probably on versions 0.86>), while trying to
> move the widgets off-screen, they actually get dumped at the
> bottom-right corner. Hence, if a user runs the existing Record
> activity on 0.88, he will observe that the bottom right quadrant of the
> screen is 'corrupted'.
>
> Fix description:
> The patch works by hiding or resizing (to size 1px by 1px) the
> widgets not required in a particular view/mode. The updateVideoComponents
> method has been modified to hide the widgets not required in a
> particular view. Widgets that can't be hidden are resized to
> 1 x 1 pixel.
>
> Additionally, this patch also fixes the naming of some variables
> (s/butt/button/g).
>
> Tested successfully on sugar-emulator-0.88, soas-mirabelle and
> xo1-f11-0.88.
Patch looks good for me, if it doesn't beat Daniel's release plans,
I guess we can commit (you are in commiters list) it and bump new Record
release (you can also release new version).
I've added you to Record developers on ASLO (you should see Record in
your Dev Hub on http://activities.sugarlabs.org/developers). Also all
7x versions rely on recent gst so these versions on ASLO are
experimental.
> Signed-off-by: anishmangal2002 <anishmangal2002 at gmail.com>
> ---
> button.py | 10 ++--
> model.py | 2 +
> p5_button.py | 30 +++++-----
> ui.py | 199 +++++++++++++++++++++++++++++++---------------------------
> 4 files changed, 129 insertions(+), 112 deletions(-)
>
> diff --git a/button.py b/button.py
> index 14b9700..2b0e85c 100644
> --- a/button.py
> +++ b/button.py
> @@ -62,12 +62,12 @@ class RecdButton(TrayButton, gobject.GObject):
> return img
>
>
> - def setButtClickedId( self, id ):
> - self.BUTT_CLICKED_ID = id
> + def setButtonClickedId( self, id ):
> + self.BUTTON_CLICKED_ID = id
>
>
> - def getButtClickedId( self ):
> - return self.BUTT_CLICKED_ID
> + def getButtonClickedId( self ):
> + return self.BUTTON_CLICKED_ID
>
>
> def setup_rollover_options( self, info ):
> @@ -105,4 +105,4 @@ class RecdButton(TrayButton, gobject.GObject):
>
>
> def _itemCopyToClipboardCb(self, widget):
> - self.ui.copyToClipboard( self.recd )
> \ No newline at end of file
> + self.ui.copyToClipboard( self.recd )
> diff --git a/model.py b/model.py
> index b7f592b..e24752e 100644
> --- a/model.py
> +++ b/model.py
> @@ -323,6 +323,8 @@ class Model:
> def startTakingPhoto( self ):
> self.setUpdating( True )
> self.ca.glive.takePhoto()
> + self.ca.ui.FULLSCREEN = False
> + self.ca.ui.updateVideoComponents()
>
>
> def savePhoto( self, pixbuf ):
> diff --git a/p5_button.py b/p5_button.py
> index cf76a34..a8e10c5 100644
> --- a/p5_button.py
> +++ b/p5_button.py
> @@ -25,7 +25,7 @@ class P5Button(P5):
> def __init__(self):
> P5.__init__(self)
> self.noloop()
> - self._butts = []
> + self._buttons = []
> self._buttonPressed = False
>
>
> @@ -34,10 +34,10 @@ class P5Button(P5):
>
> #iterate through the buttons to see if you've pressed any down
> bp = False
> - for i in range ( 0, len(self._butts) ):
> - if (self._butts[i]._enabled):
> - contains = self._butts[i].contains(event.x, event.y)
> - self._butts[i]._pressed = contains
> + for i in range ( 0, len(self._buttons) ):
> + if (self._buttons[i]._enabled):
> + contains = self._buttons[i].contains(event.x, event.y)
> + self._buttons[i]._pressed = contains
> if (contains):
> bp = True
>
> @@ -51,16 +51,16 @@ class P5Button(P5):
>
> pressed = []
> #iterate through the buttons to see if you've released on any
> - for i in range ( 0, len(self._butts) ):
> - if (self._butts[i]._enabled):
> - if (self._butts[i]._pressed):
> - if (self._butts[i].contains(event.x, event.y)):
> - pressed.append( self._butts[i] )
> -
> - if (self._butts[i]._toggle):
> - self._butts[i]._pressed = not self._butts[i]._pressed
> + for i in range ( 0, len(self._buttons) ):
> + if (self._buttons[i]._enabled):
> + if (self._buttons[i]._pressed):
> + if (self._buttons[i].contains(event.x, event.y)):
> + pressed.append( self._buttons[i] )
> +
> + if (self._buttons[i]._toggle):
> + self._buttons[i]._pressed = not self._buttons[i]._pressed
> else:
> - self._butts[i]._pressed = False
> + self._buttons[i]._pressed = False
>
> for i in range( 0, len(pressed) ):
> pressed[i].doPressed()
> @@ -170,4 +170,4 @@ class Button:
>
>
> def isImg( self ):
> - return self._img != None
> \ No newline at end of file
> + return self._img != None
> diff --git a/ui.py b/ui.py
> index d89b819..e723f66 100644
> --- a/ui.py
> +++ b/ui.py
> @@ -92,7 +92,7 @@ class UI:
> self.maxw = 49
> self.maxh = 49
> self.controlBarHt = 60
> - self.recordButtWd = 55
> + self.recordButtonWd = 55
> self.pipw = self.__class__.dim_PIPW
> self.piph = self.__class__.dim_PIPH
>
> @@ -335,7 +335,7 @@ class UI:
> self.tagsBuffer = gtk.TextBuffer()
> self.tagsBuffer.connect('changed', self._tagsBufferEditedCb)
> self.tagsField = gtk.TextView(self.tagsBuffer)
> - self.tagsField.set_size_request( 100, 100 )
> + self.tagsField.set_size_request( 50, 50 )
> self.tagsPanel.pack_start(self.tagsField, expand=True)
> self.infoBoxTopLeft.pack_start(self.tagsPanel, expand=True)
>
> @@ -369,7 +369,6 @@ class UI:
> self.centered = True
> self.setUp()
>
> -
> def _mapEventCb( self, widget, event ):
> #when your parent window is ready, turn on the feed of live video
> self.liveVideoWindow.disconnect(self.MAP_EVENT_ID)
> @@ -461,9 +460,11 @@ class UI:
> self.slowLiveVideoWindow.connect("visibility-notify-event", self._visibleNotifyCb)
>
> self.recordWindow = RecordWindow(self)
> + self.recordWindow.set_geometry_hints(min_width=1, min_height=1)
> self.addToWindowStack( self.recordWindow, self.windowStack[len(self.windowStack)-1] )
>
> self.progressWindow = ProgressWindow(self)
> + self.progressWindow.set_geometry_hints(min_width=1, min_height=1)
> self.addToWindowStack( self.progressWindow, self.windowStack[len(self.windowStack)-1] )
>
> self.maxWindow = gtk.Window()
> @@ -471,9 +472,11 @@ class UI:
> self.maxWindow.modify_bg( gtk.STATE_INSENSITIVE, Constants.colorBlack.gColor )
> maxButton = MaxButton(self)
> self.maxWindow.add( maxButton )
> + self.maxWindow.set_geometry_hints(min_width=1, min_height=1)
> self.addToWindowStack( self.maxWindow, self.windowStack[len(self.windowStack)-1] )
>
> self.scrubWindow = ScrubberWindow(self)
> + self.scrubWindow.set_geometry_hints(min_width=1, min_height=1)
> self.addToWindowStack( self.scrubWindow, self.windowStack[len(self.windowStack)-1] )
>
> self.infWindow = gtk.Window()
> @@ -492,6 +495,7 @@ class UI:
>
>
> def _visibleNotifyCb( self, widget, event ):
> + logging.debug("_visibleNotifyCb")
>
> if (self.LAUNCHING):
> return
> @@ -525,6 +529,31 @@ class UI:
> else:
> self.ca.stopPipes()
>
> + def resizeWindows( self ):
> + if self.ca.m.MODE == Constants.MODE_AUDIO:
> + self.maxWindow.resize( 1, 1 )
> + else:
> + maxDim = self.getMaxDim( self.FULLSCREEN )
> + self.maxWindow.resize( maxDim[0], maxDim[1] )
> +
> + if self.LIVEMODE:
> + self.pipBgdWindow.resize( 1, 1 )
> + self.playOggWindow.resize( 1, 1 )
> + self.livePhotoWindow.resize( 1, 1 )
> + self.slowLiveVideoWindow.resize( 1, 1 )
> + self.infWindow.resize( 1, 1 )
> + if self.ca.m.MODE == Constants.MODE_PHOTO:
> + self.progressWindow.resize( 1, 1 )
> + else:
> + pgdDim = self.getPgdDim( self.FULLSCREEN )
> + self.pipBgdWindow.resize( pgdDim[0], pgdDim[1] )
> + self.progressWindow.resize( 1, 1 )
> + self.recordWindow.resize( 1, 1 )
> + if self.ca.m.MODE == Constants.MODE_PHOTO:
> + self.playOggWindow.resize( 1, 1 )
> + self.scrubWindow.resize( 1, 1 )
> + elif self.ca.m.MODE == Constants.MODE_VIDEO:
> + self.liveVideoWindow.resize( 1, 1 )
>
> def setUpWindowsSizes( self ):
> pipDim = self.getPipDim(False)
> @@ -597,30 +626,6 @@ class UI:
> if (self.HIDE_WIDGET_TIMEOUT_ID != 0):
> gobject.source_remove( self.HIDE_WIDGET_TIMEOUT_ID )
>
> -
> - def hideWidgets( self ):
> - self.moveWinOffscreen( self.maxWindow )
> - self.moveWinOffscreen( self.pipBgdWindow )
> - self.moveWinOffscreen( self.infWindow )
> - self.moveWinOffscreen( self.slowLiveVideoWindow )
> -
> - if (self.FULLSCREEN):
> - self.moveWinOffscreen( self.recordWindow )
> - self.moveWinOffscreen( self.progressWindow )
> - self.moveWinOffscreen( self.scrubWindow )
> -
> - if (self.ca.m.MODE == Constants.MODE_PHOTO):
> - if (not self.LIVEMODE):
> - self.moveWinOffscreen( self.liveVideoWindow )
> - elif (self.ca.m.MODE == Constants.MODE_VIDEO):
> - if (not self.LIVEMODE):
> - self.moveWinOffscreen( self.liveVideoWindow )
> - elif (self.ca.m.MODE == Constants.MODE_AUDIO):
> - if (not self.LIVEMODE):
> - self.moveWinOffscreen( self.liveVideoWindow )
> - self.LAST_MODE = -1
> -
> -
> def _mouseMightaMovedCb( self ):
> x, y = self.ca.get_pointer()
> passedTime = 0
> @@ -637,18 +642,6 @@ class UI:
> self.hideWidgetsTimer = time.time()
> passedTime = 0
>
> - if (passedTime >= 3):
> - if (not self.hiddenWidgets):
> - if (self.mouseInWidget(x,y)):
> - self.hideWidgetsTimer = time.time()
> - elif (self.RECD_INFO_ON):
> - self.hideWidgetsTimer = time.time()
> - elif (self.UPDATE_TIMER_ID != 0):
> - self.hideWidgetsTimer = time.time()
> - else:
> - self.hideWidgets()
> - self.hiddenWidgets = True
> -
> self.mx = x
> self.my = y
> return True
> @@ -680,6 +673,7 @@ class UI:
>
>
> def _mediaClickedForPlayback(self, widget, event):
> + logging.debug("_mediaClickedForPlayback")
> if (not self.LIVEMODE):
> if (self.shownRecd != None):
> if (self.ca.m.MODE != Constants.MODE_PHOTO):
> @@ -875,18 +869,18 @@ class UI:
> kids = self.thumbTray.get_children()
> for i in range (0, len(kids)):
> if (self.ca.m.UPDATING or self.ca.m.RECORDING):
> - if (kids[i].getButtClickedId() != 0):
> - kids[i].disconnect( kids[i].getButtClickedId() )
> - kids[i].setButtClickedId(0)
> + if (kids[i].getButtonClickedId() != 0):
> + kids[i].disconnect( kids[i].getButtonClickedId() )
> + kids[i].setButtonClickedId(0)
> else:
> - if (kids[i].getButtClickedId() == 0):
> - BUTT_CLICKED_ID = kids[i].connect( "clicked", self._thumbClicked, kids[i].recd )
> - kids[i].setButtClickedId(BUTT_CLICKED_ID)
> + if (kids[i].getButtonClickedId() == 0):
> + BUTTON_CLICKED_ID = kids[i].connect( "clicked", self._thumbClicked, kids[i].recd )
> + kids[i].setButtonClickedId(BUTTON_CLICKED_ID)
>
>
> def hideAllWindows( self ):
> for i in range (0, len(self.windowStack)):
> - self.moveWinOffscreen( self.windowStack[i] )
> + self.windowStack[i].hide_all()
>
>
> def _liveButtonReleaseCb(self, widget, event):
> @@ -1003,6 +997,7 @@ class UI:
> self.doMouseListener( True )
> self.showLiveVideoTags()
> self.LAST_MODE = -1 #force an update
> +
> self.updateVideoComponents()
> self.resetWidgetFadeTimer()
>
> @@ -1010,7 +1005,8 @@ class UI:
> def startLiveVideo(self, force):
> #We need to know which window and which pipe here
>
> - #if returning from another activity, active won't be false and needs to be to get started
> + #if returning from another activity, active won't be false
> + #and needs to be to get started
> if (self.ca.glive.window == self.liveVideoWindow
> and self.ca.props.active
> and not force):
> @@ -1025,14 +1021,6 @@ class UI:
> self.FULLSCREEN = not self.FULLSCREEN
> self.updateVideoComponents()
>
> -
> - def moveWinOffscreen( self, win ):
> - #we move offscreen to resize or else we get flashes on screen, and setting hide() doesn't allow resize & moves
> - offW = (gtk.gdk.screen_width() + 100)
> - offH = (gtk.gdk.screen_height() + 100)
> - self.smartMove(win, offW, offH)
> -
> -
> def setImgLocDim( self, win ):
> imgDim = self.getImgDim( self.FULLSCREEN )
> self.smartResize( win, imgDim[0], imgDim[1] )
> @@ -1175,12 +1163,12 @@ class UI:
> if (self.ca.m.MODE == Constants.MODE_PHOTO):
> return [self.vw, self.controlBarHt]
> else:
> - return [self.recordButtWd, self.controlBarHt]
> + return [self.recordButtonWd, self.controlBarHt]
> else:
> if (self.ca.m.MODE == Constants.MODE_PHOTO):
> return [gtk.gdk.screen_width()-(self.inset*2), self.controlBarHt]
> else:
> - return [self.recordButtWd, self.controlBarHt]
> + return [self.recordButtonWd, self.controlBarHt]
>
>
> def getInbLoc( self, full ):
> @@ -1253,16 +1241,16 @@ class UI:
>
> def getPrgDim( self, full ):
> if (not full):
> - return [self.vw-self.recordButtWd, self.controlBarHt]
> + return [self.vw-self.recordButtonWd, self.controlBarHt]
> else:
> - return [gtk.gdk.screen_width()-(self.inset+self.inset+self.recordButtWd), self.controlBarHt]
> + return [gtk.gdk.screen_width()-(self.inset+self.inset+self.recordButtonWd), self.controlBarHt]
>
>
> def getPrgLoc( self, full ):
> if (not full):
> - return [self.centerBoxPos[0]+self.recordButtWd, self.centerBoxPos[1]+self.vh]
> + return [self.centerBoxPos[0]+self.recordButtonWd, self.centerBoxPos[1]+self.vh]
> else:
> - return [self.inset+self.recordButtWd, gtk.gdk.screen_height()-(self.inset+self.controlBarHt)]
> + return [self.inset+self.recordButtonWd, gtk.gdk.screen_height()-(self.inset+self.controlBarHt)]
>
>
> def getLoc( self, pos, full ):
> @@ -1316,6 +1304,7 @@ class UI:
> else:
> #or, if there is no countdown, it might be because we are recording
> self.clickShutter()
> + self.progressWindow.updateProgress( 1, Constants.istrFinishedRecording )
>
> else:
> #we're timing down something, but interrupted by user click or the timer completing
> @@ -1455,15 +1444,42 @@ class UI:
> elif (self.TRANSCODING):
> pos.append({"position":"tmr", "window":self.progressWindow} )
>
> - for i in range (0, len(self.windowStack)):
> - self.windowStack[i].hide_all()
> -
> self.hideAllWindows()
> self.updatePos( pos )
> + self.resizeWindows()
>
> for i in range (0, len(self.windowStack)):
> self.windowStack[i].show_all()
>
> + if self.ca.m.MODE == Constants.MODE_PHOTO:
> + if not self.LIVEMODE:
> + if self.RECD_INFO_ON == True:
> + self.maxWindow.hide_all()
> + if self.FULLSCREEN:
> + self.infWindow.hide_all()
> + else :
> + self.infWindow.hide_all()
> + self.scrubWindow.hide_all()
> + elif self.ca.m.MODE == Constants.MODE_VIDEO:
> + if not self.LIVEMODE:
> + if self.RECD_INFO_ON == True:
> + self.scrubWindow.hide_all()
> + self.maxWindow.hide_all()
> + if self.FULLSCREEN:
> + self.infWindow.hide_all()
> + else :
> + self.infWindow.hide_all()
> + self.scrubWindow.hide_all()
> + elif self.ca.m.MODE == Constants.MODE_AUDIO:
> + if not self.LIVEMODE:
> + if self.RECD_INFO_ON == True:
> + self.scrubWindow.hide_all()
> + if self.FULLSCREEN:
> + self.infWindow.hide_all()
> + else:
> + self.infWindow.hide_all()
> + self.scrubWindow.hide_all()
> +
> self.LAST_MODE = self.ca.m.MODE
> self.LAST_FULLSCREEN = self.FULLSCREEN
> self.LAST_LIVE = self.LIVEMODE
> @@ -1548,16 +1564,16 @@ class UI:
> if (kids[i].recd == recd):
> self.thumbTray.remove_item(kids[i])
> kids[i].cleanUp()
> - kids[i].disconnect( kids[i].getButtClickedId() )
> - kids[i].setButtClickedId(0)
> + kids[i].disconnect( kids[i].getButtonClickedId() )
> + kids[i].setButtonClickedId(0)
>
>
> def addThumb( self, recd, forceScroll ):
> - butt = RecdButton( self, recd )
> - BUTT_CLICKED_ID = butt.connect( "clicked", self._thumbClicked, recd )
> - butt.setButtClickedId(BUTT_CLICKED_ID)
> - self.thumbTray.add_item( butt, len(self.thumbTray.get_children()) )
> - butt.show()
> + button = RecdButton( self, recd )
> + BUTTON_CLICKED_ID = button.connect( "clicked", self._thumbClicked, recd )
> + button.setButtonClickedId(BUTTON_CLICKED_ID)
> + self.thumbTray.add_item( button, len(self.thumbTray.get_children()) )
> + button.show()
> if (forceScroll):
> self.thumbTray.scroll_to_end()
>
> @@ -1567,8 +1583,8 @@ class UI:
> for i in range (0, len(kids)):
> self.thumbTray.remove_item(kids[i])
> kids[i].cleanUp()
> - if (kids[i].getButtClickedId() != 0):
> - kids[i].disconnect( kids[i].getButtClickedId() )
> + if (kids[i].getButtonClickedId() != 0):
> + kids[i].disconnect( kids[i].getButtonClickedId() )
>
>
> def _thumbClicked( self, button, recd ):
> @@ -1659,7 +1675,6 @@ class UI:
> if (self.RECD_INFO_ON):
> self.bottomCenter.add( self.namePanel )
> self.bottomCenter.show_all()
> -
> self.resetWidgetFadeTimer()
>
>
> @@ -1913,22 +1928,22 @@ class ScrubberWindow(gtk.Window):
> self.add( self.hbox )
>
> self.button = gtk.Button()
> - buttBox = gtk.EventBox()
> - buttBox.add(self.button)
> - buttBox.modify_bg( gtk.STATE_NORMAL, Constants.colorBlack.gColor )
> + buttonBox = gtk.EventBox()
> + buttonBox.add(self.button)
> + buttonBox.modify_bg( gtk.STATE_NORMAL, Constants.colorBlack.gColor )
> self.button.set_image( Constants.recPlayImg )
> self.button.set_property('can-default', True)
> self.button.set_relief(gtk.RELIEF_NONE)
> - self.button.set_size_request( self.ui.recordButtWd, self.ui.recordButtWd )
> - buttBox.set_size_request( self.ui.recordButtWd, self.ui.recordButtWd )
> + self.button.set_size_request( self.ui.recordButtonWd, self.ui.recordButtonWd )
> + buttonBox.set_size_request( self.ui.recordButtonWd, self.ui.recordButtonWd )
> #self.button.set_border_width( UI.dim_INSET/2 )
> self.button.show()
>
> - buttBox.modify_bg( gtk.STATE_NORMAL, Constants.colorBlack.gColor )
> + buttonBox.modify_bg( gtk.STATE_NORMAL, Constants.colorBlack.gColor )
> self.button.modify_bg( gtk.STATE_ACTIVE, Constants.colorBlack.gColor )
>
> self.button.connect('clicked', self._buttonClickedCb)
> - self.hbox.pack_start(buttBox, expand=False)
> + self.hbox.pack_start(buttonBox, expand=False)
>
> self.adjustment = gtk.Adjustment(0.0, 0.00, 100.0, 0.1, 1.0, 1.0)
> self.hscale = gtk.HScale(self.adjustment)
> @@ -2067,11 +2082,11 @@ class MaxButton(P5Button):
> xs.append(0)
> ys.append(self.ui.maxh)
> poly = Polygon( xs, ys )
> - butt = Button( poly, 0, 0)
> - butt.addActionListener( self )
> + button = Button( poly, 0, 0)
> + button.addActionListener( self )
> self.maxS = "max"
> - butt.setActionCommand( self.maxS )
> - self._butts.append( butt )
> + button.setActionCommand( self.maxS )
> + self._buttons.append( button )
>
>
> def draw(self, ctx, w, h):
> @@ -2108,11 +2123,11 @@ class InfButton(P5Button):
> xs.append(0)
> ys.append(75)
> poly = Polygon( xs, ys )
> - butt = Button( poly, 0, 0)
> - butt.addActionListener( self )
> + button = Button( poly, 0, 0)
> + button.addActionListener( self )
> self.infS = "inf"
> - butt.setActionCommand( self.infS )
> - self._butts.append( butt )
> + button.setActionCommand( self.infS )
> + self._buttons.append( button )
>
>
> def draw(self, ctx, w, h):
> @@ -2170,7 +2185,7 @@ class RecordWindow(gtk.Window):
> self.modify_bg( gtk.STATE_NORMAL, Constants.colorBlack.gColor )
>
> self.shutterButton = RecordButton()
> - self.shutterButton.set_size_request(self.ui.recordButtWd, self.ui.recordButtWd)
> + self.shutterButton.set_size_request(self.ui.recordButtonWd, self.ui.recordButtonWd)
> self.shutterButton.set_relief(gtk.RELIEF_NONE)
> self.shutterButton.set_image( Constants.recImg )
> self.shutterButton.connect("clicked", self.ui._shutterClickCb)
> @@ -2264,10 +2279,10 @@ class ProgressWindow(gtk.Window):
> self.progBar.modify_bg( gtk.STATE_PRELIGHT, Constants.colorBlack.gColor )
> self.progBar.modify_bg( gtk.STATE_SELECTED, Constants.colorBlack.gColor )
> self.progBar.modify_bg( gtk.STATE_INSENSITIVE, Constants.colorBlack.gColor )
> - vb.add( self.progBar )
> + vb.pack_start( self.progBar, True, True, 0 )
>
> hbox = gtk.HBox()
> - vb.add( hbox )
> + vb.pack_start( hbox, True, True, 0 )
> self.infoLabel = gtk.Label()
> self.infoLabel.set_alignment( 1, .5 )
> self.infoLabel.set_text( "<b><span foreground='black'>SPACE</span></b>")
> --
> 1.7.0.4
>
--
Aleksey
More information about the Sugar-devel
mailing list