Exemple #1
0
def bzr_qcommands(c, p, menu):
    """see module docs."""

    menu = menu.addMenu("bzr")

    # special case, no q* command for stat
    def bzr_stat(c=c, p=p):
        path = g.scanAllAtPathDirectives(c, p) or c.getNodePath(p)
        cmd = subprocess.Popen(['bzr', 'stat', path],
                               stdin=subprocess.PIPE,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
        stdout, stderr = cmd.communicate()
        g.es("\n\n".join([stdout, stderr]))

    action = menu.addAction('stat')
    action.connect(action, QtCore.SIGNAL("triggered()"), bzr_stat)

    qcoms = "qadd qannotate qbind qbranch qbrowse qcat qcommit qconfig " \
            "qconflicts qdiff qexport qgetnew qgetupdates qinfo qinit " \
            "qlog qmerge qplugins qpull qpush qrevert qrun qsend " \
            "qswitch qtag qunbind quncommit qupdate qversion qviewer".split()
    for qcom in qcoms:

        def cmd(c=c, p=p, qcom=qcom):
            path = g.scanAllAtPathDirectives(c, p) or c.getNodePath(p)
            cmd = subprocess.Popen(['bzr', qcom, path])
            cmd.communicate()

        action = menu.addAction(qcom)
        action.connect(action, QtCore.SIGNAL("triggered()"), cmd)
Exemple #2
0
    def start (self,event):
        
        c = self.c
        
        # Create the callback to insert the selected completion.
        def completion_callback(completion,self=self):
            self.end(completion)
        
        # Create the completer.
        cpl = c.frame.top.completer = self.completer = QCompleter()
        cpl.setWidget(self.body)
        cpl.connect(cpl,QtCore.SIGNAL("activated(QString)"),completion_callback)
        
        # Connect key strokes to the popup.
        # self.popup = cpl.popup()
        # self.popup_filter = PopupEventFilter(c,self.popup) # Required
        # self.popup.installEventFilter(self.popup_filter)
        # self.popup.setFocus()

        # Set the flag for the event filter: all keystrokes will go to cc.onKey.
        self.active = True
        self.ev_filter.ctagscompleter_active = True
        self.ev_filter.ctagscompleter_onKey = self.onKey
        
        # Show the completions.
        self.complete(event)
Exemple #3
0
    def connected(self):

        '''Event handler for newConnection.'''

        lprint("hnd con")
        lsock = self.srv.nextPendingConnection()
        lprint("conn", lsock)

        buf =  LProtoBuf()

        self.ses[lsock] = ses_ent = {'_sock': lsock, '_buf': buf}

        def msg_recv_cb(msg):
            self.msg_received(msg, ses_ent)

        buf.set_recv_cb( msg_recv_cb )

        def readyread_cb():
            lprint("read ready")
            allbytes = lsock.readAll()
            buf = ses_ent['_buf']
            buf.push_bytes(allbytes)

        lsock.connect(lsock,
            QtCore.SIGNAL('readyRead()'),
            readyread_cb)
Exemple #4
0
    def __init__(self):

        self.srv = QtNetwork.QLocalServer()
        self.receiver = None
        self.ses = {}

        self.is_connected = self.srv.connect(self.srv,
                                             QtCore.SIGNAL("newConnection()"),
                                             self.connected)
Exemple #5
0
    def __init__(self, c, mode="nav", parent=None):

        QtWidgets.QWidget.__init__(self, parent)

        self.ui = qt_quicksearch.Ui_LeoQuickSearchWidget()
        self.ui.setupUi(self)

        # set to True after return is pressed in nav mode, to disable live updates until field is cleaned again
        self.frozen = False
        w = self.ui.listWidget
        u = self.ui
        cc = QuickSearchController(c, w, u)
        self.scon = cc

        if mode == "popout":
            self.setWindowTitle("Go anywhere")
            if 1:
                self.ui.lineEdit.returnPressed.connect(self.selectAndDismiss)
            else:
                self.connect(self.ui.lineEdit,
                             QtCore.SIGNAL("returnPressed()"),
                             self.selectAndDismiss)
            threadutil.later(self.ui.lineEdit.setFocus)
        else:
            if 1:
                self.ui.lineEdit.returnPressed.connect(self.returnPressed)
            else:
                self.connect(self.ui.lineEdit,
                             QtCore.SIGNAL("returnPressed()"),
                             self.returnPressed)
        if 1:
            self.ui.lineEdit.textChanged.connect(self.liveUpdate)
        else:
            self.connect(self.ui.lineEdit,
                         QtCore.SIGNAL("textChanged(QString)"),
                         self.liveUpdate)

        self.ev_filter = QuickSearchEventFilter(c, w, self.ui.lineEdit)
        self.ui.lineEdit.installEventFilter(self.ev_filter)
        self.c = c
Exemple #6
0
 def __init__(self, owner):
     '''Ctor for backlinkQtUI class.'''
     self.owner = owner
     QtWidgets.QWidget.__init__(self)
     uiPath = g.os_path_join(g.app.leoDir, 'plugins', 'Backlink.ui')
     form_class, base_class = uic.loadUiType(uiPath)
     self.owner.c.frame.log.createTab('Links', widget = self) 
     self.UI = form_class()
     self.UI.setupUi(self)
     u = self.UI
     o = self.owner
     if 1: # Compatible with PyQt5
         u.markBtn.clicked.connect(o.mark)
         u.swapBtn.clicked.connect(o.swap)
         u.linkBtn.clicked.connect(self.linkClicked)
         u.rescanBtn.clicked.connect(o.loadLinksInt)
         u.dirLeftBtn.clicked.connect(self.dirClicked)
         u.dirRightBtn.clicked.connect( self.dirClicked)
         u.linkList.itemClicked.connect(self.listClicked)
         u.deleteBtn.stateChanged.connect(o.deleteSet)
     else: # old code 
         self.connect(u.markBtn,
             QtCore.SIGNAL("clicked()"), o.mark)
         self.connect(u.swapBtn,
             QtCore.SIGNAL("clicked()"), o.swap)
         self.connect(u.linkBtn,
             QtCore.SIGNAL("clicked()"), self.linkClicked)
         self.connect(u.rescanBtn,
             QtCore.SIGNAL("clicked()"), o.loadLinksInt)
         self.connect(u.dirLeftBtn, 
             QtCore.SIGNAL("clicked()"), self.dirClicked)
         self.connect(u.dirRightBtn, 
             QtCore.SIGNAL("clicked()"), self.dirClicked)
         self.connect(u.linkList,
             QtCore.SIGNAL("itemClicked(QListWidgetItem*)"), self.listClicked)
         self.connect(u.deleteBtn,
             QtCore.SIGNAL("stateChanged(int)"), o.deleteSet)
Exemple #7
0
def rclick_path_importfile(c, p, menu):
    if not p.h.startswith('@path'):
        return

    def importfiles_rclick_cb():
        aList = g.get_directives_dict_list(p)
        path = c.scanAtPathDirectives(aList)
        table = [
            ("All files", "*"),
            ("Python files", "*.py"),
        ]
        # This is incomplete: files is not used.
        # files = g.app.gui.runOpenFileDialog(c,
        g.app.gui.runOpenFileDialog(c,
                                    title="Import files",
                                    filetypes=table,
                                    defaultextension='.notused',
                                    multiple=True)
        print("import files from", path)

    action = menu.addAction("Import files")
    action.connect(action, QtCore.SIGNAL("triggered()"), importfiles_rclick_cb)
Exemple #8
0
    def start (self,event):

        c = self.c

        # Create the callback to insert the selected completion.
        def completion_callback(completion,self=self):
            # pylint: disable=maybe-no-member
            self.end(completion)

        # Create the completer.
        cpl = c.frame.top.completer = self.completer = QCompleter()
        cpl.setWidget(self.body)
        cpl.connect(cpl,QtCore.SIGNAL("activated(QString)"),completion_callback)

        # Set the flag for the event filter: all keystrokes will go to cc.onKey.
        self.active = True
        self.ev_filter.ctagscompleter_active = True
        self.ev_filter.ctagscompleter_onKey = self.complete
            # EKR: was self.onKey, which does not exist.

        # Show the completions.
        self.complete(event)
Exemple #9
0
 def popup(self, c, p, menu):
     """make popup menu entry for tree context menu"""
     # pylint: disable=function-redefined
     # several callbacks have the same name.
     if c != self.c:
         return  # wrong commander
     for cb, name in reversed(self.recent_moves):
         a = QtGui.QAction(name, menu)
         a.connect(a, QtCore.SIGNAL("triggered()"), 
                   lambda cb=cb, name=name: self.do_wrap(cb, name))
         menu.insertAction(menu.actions()[0], a)
     pathmenu = menu.addMenu("Move")
     # copy / cut to other outline
     for txt, cut in ("Copy to...", False), ("Move to...", True):
         sub = pathmenu.addMenu(txt)
         # global targets
         for target in g.app.db['_quickmove']['global_targets']:
             a = sub.addAction(target['name'])
             def cb(c2=target['unl'], cut=cut):
                 self.to_other(c2, cut=cut)
             def wrap(cb=cb, name=txt.strip('.')+' '+target['name']):
                 self.do_wrap(cb, name)
             a.connect(a, QtCore.SIGNAL("triggered()"), wrap)
         # top of open outlines
         for c2 in g.app.commanders():
             a = sub.addAction("Top of " +
                 g.os_path_basename(c2.fileName()))
             def cb(c2=c2, cut=cut):
                 self.to_other(c2, cut=cut)
             def wrap(cb=cb, name=txt.strip('.')+' top of '+g.os_path_basename(c2.fileName())):
                 self.do_wrap(cb, name)
             a.connect(a, QtCore.SIGNAL("triggered()"), wrap)
     # bookmark to other outline 
     sub = pathmenu.addMenu("Bookmark to...")
     # global targets
     for target in g.app.db['_quickmove']['global_targets']:
         a = sub.addAction(target['name'])
         def cb(c2=target['unl'], cut=cut):
             self.bookmark_other(c2)
         def wrap(cb=cb, name="Bookmark to "+target['name']):
             self.do_wrap(cb, name)
         a.connect(a, QtCore.SIGNAL("triggered()"), wrap)
     # top of open outlines
     for c2 in g.app.commanders():
         a = sub.addAction(g.os_path_basename(c2.fileName()))
         def cb(c2=c2):
             self.bookmark_other(c2)
         def wrap(cb=cb, name="Bookmark to top of "+g.os_path_basename(c2.fileName())):
             self.do_wrap(cb, name)
         a.connect(a, QtCore.SIGNAL("triggered()"), wrap)
     # actions within this outline
     need_submenu = 'Move', 'Copy', 'Clone', 'Bookmark', 'Link'
     current_kind = None
     current_submenu = None
     for name,dummy,command in self.local_imps:
         kind = name.split()[0]
         if kind in need_submenu:
             if current_kind != kind:
                 current_submenu = pathmenu.addMenu(kind)
                 current_kind = kind
         else:
             current_submenu = pathmenu
         a = current_submenu.addAction(name)
         a.connect(a, QtCore.SIGNAL("triggered()"), command)
     # add new global target, etc.
     a = pathmenu.addAction("Add node as target")
     a.connect(a, QtCore.SIGNAL("triggered()"), 
          lambda p=p: self.add_target(p))
     a = pathmenu.addAction("Show targets")
     a.connect(a, QtCore.SIGNAL("triggered()"), 
          lambda p=p: self.show_targets())
     a = pathmenu.addAction("Read targets")
     a.connect(a, QtCore.SIGNAL("triggered()"), 
          lambda p=p: self.read_targets())
Exemple #10
0
    def addButton (self, which, type_="move", v=None, parent=None):
        '''Add a button that creates a target for future moves.'''
        c = self.c
        p = c.p
        if v is None:
            v = p.v
        sc = scriptingController(c)
        mb = quickMoveButton(self,v,which,type_=type_)
        txt=self.txts[type_]

        if parent:  # find parent button
            for i in self.buttons:
                if i[0].target.gnx == parent:
                    parent = i[1]
                    break
            else:
                g.es('Move to button parent not found, placing at top level')
                parent = None

        header = v.anyAtFileNodeName() or v.h  # drop @auto etc.

        text = txt + ":" + header if txt else header
        # createButton truncates text.  

        if parent and g.app.gui.guiName() == "qt":
            pb = parent.button
            rc = QtGui.QAction(text, pb)
            rc.connect(rc, QtCore.SIGNAL("triggered()"), mb.moveCurrentNodeToTarget)
            pb.insertAction(pb.actions()[0], rc)  # insert at top
            b = None
            mb.has_parent = True
            t = QtCore.QString(c.config.getString('mod_scripting_subtext') or '')
            if not unicode(pb.text()).endswith(unicode(t)):
                pb.setText(pb.text()+t)
        else:
            b = sc.createIconButton(
                args=None,
                text=text,
                command = mb.moveCurrentNodeToTarget,
                statusLine = '%s current node to %s child of %s' % (
                    type_.title(), which, v.h),
                kind = "quick-move"
            )
            if g.app.gui.guiName() == "qt":

                def cb_goto_target(event=None, c=c, v=v):
                    p = c.vnode2position(v)
                    c.selectPosition(p)
                    c.redraw()

                def cb_set_parent(event=None, c=c, v=v, first=which, type_=type_):
                    c.quickMove.set_parent(v, first, type_)

                def cb_permanent(event=None, c=c, v=v, type_=type_, first=which):
                    c.quickMove.permanentButton(v=v, type_=type_, first=first)

                # def cb_clear(event=None, c=c, v=v):
                #     c.quickMove.clearButton(v)

                for cb, txt in [
                    (cb_goto_target, 'Goto target'),
                    (cb_permanent, 'Make permanent'),
                    # (cb_clear, 'Clear permanent'),
                    (cb_set_parent, 'Set parent'), 
                ]:
                    but = b.button
                    rc = QtGui.QAction(txt, but)
                    rc.connect(rc, QtCore.SIGNAL("triggered()"), cb)
                    but.insertAction(but.actions()[-1], rc)
                        # insert rc before Remove Button

        self.buttons.append((mb,b))
Exemple #11
0
def install_qt_quicksearch_tab(c):

    #tabw = c.frame.top.tabWidget

    wdg = LeoQuickSearchWidget(c, mode="nav")
    qsWidgent = wdg
    c.frame.log.createTab("Nav", widget=wdg)

    #tabw.addTab(wdg, "QuickSearch")

    def focus_quicksearch_entry(event):
        c.frame.log.selectTab('Nav')
        wdg.ui.lineEdit.selectAll()
        wdg.ui.lineEdit.setFocus()

    def focus_to_nav(event):
        c.frame.log.selectTab('Nav')
        wdg.ui.listWidget.setFocus()

    def find_selected(event):
        text = c.frame.body.wrapper.getSelectedText()
        if text.strip():
            wdg.ui.lineEdit.setText(text)
            wdg.returnPressed()
            focus_to_nav(event)
        else:
            focus_quicksearch_entry(event)

    def nodehistory(event):
        c.frame.log.selectTab('Nav')
        wdg.scon.doNodeHistory()

    def show_dirty(event):
        c.frame.log.selectTab('Nav')
        wdg.scon.doChanged()

    def timeline(event):
        c.frame.log.selectTab('Nav')
        wdg.scon.doTimeline()

    c.k.registerCommand('find-quick', None, focus_quicksearch_entry)
    c.k.registerCommand('find-quick-selected', 'Ctrl-Shift-f', find_selected)
    c.k.registerCommand('focus-to-nav', None, focus_to_nav)
    c.k.registerCommand('find-quick-test-failures', None,
                        show_unittest_failures)
    c.k.registerCommand('find-quick-timeline', None, timeline)
    c.k.registerCommand('find-quick-changed', None, show_dirty)
    c.k.registerCommand('history', None, nodehistory)

    @g.command('marked-list')
    def showmarks(event):
        """ List marked nodes in nav tab """
        #c.frame.log.selectTab('Nav')
        wdg.scon.doShowMarked()

    @g.command('go-anywhere')
    def find_popout_f(event):
        c = event['c']
        w = LeoQuickSearchWidget(c, mode="popout", parent=c.frame.top)
        topgeo = c.frame.top.geometry()
        wid = topgeo.width()
        w.setGeometry(wid / 2, 0, wid / 2, 500)
        #w.setParent(c.frame.top)
        #w.setWindowFlags(QtConst.FramelessWindowHint)
        w.show()
        w.setFocus(QtConst.OtherFocusReason)
        #w.setGeometry(100,0,800,500)
        c._popout = w

    c.frame.nav = wdg

    # make activating this tab activate the input box
    def activate_input(idx, c=c):
        wdg = c.frame.nav
        tab_widget = wdg.parent().parent()
        if tab_widget.currentWidget() == wdg:
            wdg.ui.lineEdit.selectAll()
            wdg.ui.lineEdit.setFocus()

    # Careful: we may be unit testing.
    if wdg and wdg.parent():
        tab_widget = wdg.parent().parent()
        if 1:
            tab_widget.currentChanged.connect(activate_input)
        else:
            tab_widget.connect(tab_widget,
                               QtCore.SIGNAL("currentChanged(int)"),
                               activate_input)
Exemple #12
0
    def __init__(self, c, listWidget):

        self.c = c
        self.lw = w = listWidget  # A QListWidget.
        self.its = {}  # Keys are id(w),values are tuples (p,pos)
        self.worker = threadutil.UnitWorker()

        self.frozen = False

        def searcher(inp):
            #print("searcher", inp)
            if self.frozen:
                return
            exp = inp.replace(" ", "*")
            res = self.bgSearch(exp)

            return res

        def dumper():
            # always run on ui thread
            if self.frozen:
                return
            out = self.worker.output
            #print("dumper")
            self.throttler.add(out)

        def throttledDump(lst):
            """ dumps the last output """
            #print "Throttled dump"
            # we do get called with empty list on occasion

            if not lst:
                return
            if self.frozen:
                return
            hm, bm = lst[-1]
            self.clear()
            self.addHeadlineMatches(hm)
            self.addBodyMatches(bm)

        self.throttler = threadutil.NowOrLater(throttledDump)

        self.worker.set_worker(searcher)
        #self.worker.set_output_f(dumper)
        self.worker.resultReady.connect(dumper)
        self.worker.start()

        if 1:  # Compatible with PyQt5
            # we want both single-clicks and activations (press enter)
            w.itemActivated.connect(self.onActivated)
            w.itemPressed.connect(self.onSelectItem)
            w.currentItemChanged.connect(self.onSelectItem)
        else:
            # we want both single-clicks and activations (press enter)
            w.connect(w, QtCore.SIGNAL("itemActivated(QListWidgetItem*)"),
                      self.onActivated)
            w.connect(w, QtCore.SIGNAL("itemPressed(QListWidgetItem*)"),
                      self.onSelectItem)
            w.connect(
                w,
                QtCore.SIGNAL(
                    "currentItemChanged(QListWidgetItem*,QListWidgetItem *)"),
                self.onSelectItem)