Mercurial > libervia-web
diff src/browser/sat_browser/libervia_widget.py @ 659:8e7d4de56e75 frontends_multi_profiles
browser_side: allow to drop a widget in the "+" tab
author | souliane <souliane@mailoo.org> |
---|---|
date | Fri, 27 Feb 2015 16:05:28 +0100 |
parents | 476d8d9973d3 |
children | ebb602d8b3f2 |
line wrap: on
line diff
--- a/src/browser/sat_browser/libervia_widget.py Fri Feb 27 02:42:44 2015 +0100 +++ b/src/browser/sat_browser/libervia_widget.py Fri Feb 27 16:05:28 2015 +0100 @@ -105,6 +105,7 @@ DragLabel.onDragEnd(self, event) LiberviaDragWidget.current = None + class DropCell(DropWidget): """Cell in the middle grid which replace itself with the dropped widget on DnD""" drop_keys = {} @@ -253,7 +254,6 @@ self.tab_panel = tab_panel self.setStyleName('dropCell') self.setWordWrap(False) - DOM.setStyleAttribute(self.getElement(), "min-width", "30px") def _getIndex(self): """ get current index of the DropTab """ @@ -276,7 +276,7 @@ DOM.eventPreventDefault(event) self.parent.removeStyleName('dragover') if self._getIndex() == self.tab_panel.tabBar.getSelectedTab(): - # the widget come from the DragTab, so nothing to do, we let it there + # the widget comes from the same tab, so nothing to do, we let it there return # FIXME: quite the same stuff as in DropCell, need some factorisation @@ -293,19 +293,31 @@ log.debug("no message found") item = ' ' item_type = None + if item_type == "WIDGET": if not LiberviaDragWidget.current: log.error("No widget registered in LiberviaDragWidget !") return _new_panel = LiberviaDragWidget.current - _new_panel.getParent(WidgetsPanel, expect=True).removeWidget(_new_panel) elif item_type in DropCell.drop_keys: - _new_panel = DropCell.drop_keys[item_type](self.tab_panel.host, item) + pass # create the widget when we are sure there's a tab for it else: log.warning("unmanaged item type") return - widgets_panel = self.tab_panel.getWidget(self._getIndex()) + # XXX: when needed, new tab creation must be done exactly here to not mess up with LiberviaDragWidget.onDragEnd + try: + widgets_panel = self.tab_panel.getWidget(self._getIndex()) + except IndexError: # widgets panel doesn't exist, e.g. user dropped in "+" tab + widgets_panel = self.tab_panel.addWidgetsTab(None) + if widgets_panel is None: # user cancelled + return + + if item_type == "WIDGET": + _new_panel.getParent(WidgetsPanel, expect=True).removeWidget(_new_panel) + else: + _new_panel = DropCell.drop_keys[item_type](self.tab_panel.host, item) + widgets_panel.addWidget(_new_panel) @@ -749,7 +761,7 @@ ClickHandler.__init__(self) self.host = host self.setStyleName('liberviaTabPanel') - self.tabBar.addTab(u'✚', asHTML=True) + self.tabBar.addTab(DropTab(self, u'✚'), asHTML=False) self.tabBar.setVisible(False) # set to True when profile is logged self.tabBar.addStyleDependentName('oneTab') @@ -758,14 +770,7 @@ TabPanel.onTabSelected(self, sender, tabIndex) return # user clicked the "+" tab - default_label = _(u'new tab') - try: - label = Window.prompt(_(u'Name of the new tab'), default_label) - if not label: - return # empty label or user pressed "cancel" - except: # this happens when the user prevents the page to open the prompt dialog - label = default_label - self.addWidgetsTab(label, select=True) + self.addWidgetsTab(None, select=True) def getCurrentPanel(self): """ Get the panel of the currently selected tab @@ -791,7 +796,7 @@ def addWidgetsTab(self, label, select=False, locked=False): """Create a new tab for containing LiberviaWidgets. - @param label (unicode): label of the tab + @param label (unicode): label of the tab (None or '' for user prompt) @param select (bool): True to select the added tab @param locked (bool): If True, the tab will not be removed when there are no more widget inside. If False, the tab will be removed with @@ -799,6 +804,16 @@ @return: WidgetsPanel """ widgets_panel = WidgetsPanel(self.host, locked=locked) + + if not label: + default_label = _(u'new tab') + try: + label = Window.prompt(_(u'Name of the new tab'), default_label) + if not label: # empty label or user pressed "cancel" + return None + except: # this happens when the user prevents the page to open the prompt dialog + label = default_label + self.addTab(widgets_panel, label, select) return widgets_panel