Jump to content
Sign in to follow this  
jaberwacky

MouseHoverCallTips [09/25/2014]

Recommended Posts

They look the same to me. Could you show me what you mean?

Managed by myself by accident, when I put an extra ";" in the comment line it triggers a line break in the calltip which is what I was looking for. However, playing around with the system now I have another problem, if I have a

#include <gui.au3>

in my main.au3 and the gui.au3 contains a function called "Func gui_($method, $params = '') ; comment here" then that calltip shows up when I am editing the gui.au3 but unfortunately not when I'm editing the main.au3 (where the gui_ function is normally used). Any idea what could be going wrong?

Share this post


Link to post
Share on other sites

Managed by myself by accident, when I put an extra ";" in the comment line it triggers a line break in the calltip which is what I was looking for. However, playing around with the system now I have another problem, if I have a

#include <gui.au3>

in my main.au3 and the gui.au3 contains a function called "Func gui_($method, $params = '') ; comment here" then that calltip shows up when I am editing the gui.au3 but unfortunately not when I'm editing the main.au3 (where the gui_ function is normally used). Any idea what could be going wrong?

Ok, found out what the problem is and here's a subtle'ish bug report: it seems the MouseHoverCallTips:OnOpen function fails to fire consecutively when loading files via SciTE.session files - hence the MouseHoverCallTips:get_includes_list doesn't get to do its job..etc. Would submit patch but I've never done any Lua work so will have to pass on this one.

Update, this function patch (to CalltipsOnMouseHover.lua) partly fixes the problem with files loaded via session but the initial file displayed still does not show calltips before it has been "switched to".

function MouseHoverCallTips:OnSwitchFile(file_path)
if self:is_au3_file() then
     self:initialize_mouse_dwell()
     self:get_includes_list(file_path, 1)
end
return false
end
Edited by Sunaj

Share this post


Link to post
Share on other sites

Also, a question, is it possible to do line breaks in Function comment/description? So as to emulate the format used by for example _ArrayDisplay and others

OK, here is what _ArrayDisplay's calltip looks like when I use the native intellisense:

_ArrayDisplay (Const ByRef $avArray [, $sTitle = "Array: ListView Display" [, $iItemLimit = -1 [, $iTranspose = 0 [, $sSeparator = "" [, $sReplace = "|" [, $sHeader = ""]]]]]])
Displays given 1D or 2D array array in a listview. (Requires: #include <Array.au3>)

And here is what it looks like when I use Mousehover --> Calltip:

_ArrayDisplay (Const ByRef $avArray [, $sTitle = "Array: ListView Display" [, $iItemLimit = -1 [, $iTranspose = 0 [, $sSeparator = "" [, $sReplace = "|" [, $sHeader = ""]]]]]])
Displays given 1D or 2D array array in a listview.
(Requires: #include <Array.au3>)

I did decide to put the (requires:... section on its own line.

Managed by myself by accident, when I put an extra ";" in the comment line it triggers a line break in the calltip which is what I was looking for.

Are you referring to when you have a func definition with a comment on the same line?
Func my_awesome_function() ; this is my awesome function.
If so then you shouldn't have to put two semi colons. So I will look into that.

Edit: OK, if you want an extra line feed then yes just put two semi colons.

Ok, found out what the problem is and here's a subtle'ish bug report: it seems the MouseHoverCallTips:OnOpen function fails to fire consecutively when loading files via SciTE.session files - hence the MouseHoverCallTips:get_includes_list doesn't get to do its job..etc. Would submit patch but I've never done any Lua work so will have to pass on this one.

Update, this function patch (to CalltipsOnMouseHover.lua) partly fixes the problem with files loaded via session but the initial file displayed still does not show calltips before it has been "switched to".

function MouseHoverCallTips:OnSwitchFile(file_path)
if self:is_au3_file() then
     self:initialize_mouse_dwell()
     self:get_includes_list(file_path, 1)
end
return false
end
Thank you. I will look into this some more.

Edit: Ok, I don't experience the issue that you describe. Maybe I have misunderstood?

Edited by jaberwocky6669

Share this post


Link to post
Share on other sites

Thank you. I will look into this some more.

Edit: Ok, I don't experience the issue that you describe. Maybe I have misunderstood?

First of all the line break thing is all fine: as you say I can put semi colons in the comment to allow for as many/few line breaks as I need.

Secondarily: The session loading issue remains for me: I have two files, alpha.au3 and beta.au3 and I call a Func in alpha.au3 with the name firstfunc($ding) and that Func is located in beta.au3 (which is included in alpha.au3 of course). Now I take those two files and save them in a session when alpha.au3 is in focus (SciTE.session), next time I open the session file I do not get the calltip displayed on firstfunc($ding).

I tried incl. the firstfunc($ding) function directly in alpha.au3 and then the calltip works (?!).

With the patch/hack I submitted above I can let firstfunc($ding) function remain in beta.au3 and switch back and forth between the two tabs and then all is normal with the calltip inside the alpha.au3 file. This is a minor issue but it is there >_<

Share this post


Link to post
Share on other sites

Really I set it up just now exactly as you described with the names all the same and I saved them into a session. I then opened the session and I get a calltip every time.

I'm hoping someone else will weigh in here and try it out too.

Edited by jaberwocky6669

Share this post


Link to post
Share on other sites

Really I set it up just now exactly as you described with the names all the same and I saved them into a session. I then opened the session and I get a calltip every time.

I'm hoping someone else will weigh in here and try it out too.

Thanks for taking the time, I have included my code below with comments to describe issue, also I have uninstalled/reinstalled SciTE and AutoIt to make sure that the setup isn't wonky; unfortunately still seeing issue, I don't need to use session file to see issue now (might have been same all along, sorry about that). FInal detail: I'm on Win7 32bit edition, all updated..etc.

file: alpha.au3

#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.8.1, SciTE Version : 6/10/2012
Script Function:
Test CallTipsOnMouseHover.lua versus include files
#ce ----------------------------------------------------------------------------
#include"beta.au3"

alpha_firstfunc('testing') ; this comes up fine
beta_secondfunc('testing again') ; i see no call tip here?!

Func alpha_firstfunc($dang) ; here's alpha_firstfunc calltip, note the intelligent parameter
ConsoleWrite('@@ (13) :(' & @MIN & ':' & @SEC & ') firstfunc(): ' & $dang & @CR) ;### Function Trace
EndFunc

file: beta.au3

Func beta_secondfunc($ding) ; here's beta_secondfunc calltip, note the intelligent parameter
ConsoleWrite('@@ (13) :(' & @MIN & ':' & @SEC & ') firstfunc(): ' & $ding & @CR) ;### Function Trace
EndFunc

edit: couple of comment typos and file description clarified

Edited by Sunaj

Share this post


Link to post
Share on other sites

Ok, finally found correct solution to my problem: this function, inside CalltipsOnMouseHover.lua:

function MouseHoverCallTips:get_include_from_line(line)
if not line then return '' end
if string.find(line, "^%s*#include%s+") then
 
  -- Anything between <, >, ', or "
  local include = string.match(line, "[\<\"\']%s*.+\.au3%s*[\'\"\>]")
  if include == nil then return '' end
  return string.sub(include, 2, -2)
end
return ''
end

does NOT do what it is intended to do unless I change this line:

if string.find(line, "^%s*#include%s+") then

to read:

if string.find(line, "#include") then

instead.. then all is fine, I don't understand why I'm am the only one seeing this problem, tried it out on two computers so far and can replicate just fine. Anywho, I'm a happy camper now so.. over and out.

Share this post


Link to post
Share on other sites

Ahh, I see why now. The '+' in "^%s*#include%s+" searches for one or more spaces. I changed it to '*' to search for zero or more spaces.

Thanks for the bug report! I'll include your name in the list of contributors.

Edited by jaberwocky6669

Share this post


Link to post
Share on other sites

Another nugget spotted: if you are using a function in an included file (say include.au3) that is written in out in the mother script (main.au3) then the calltip fails to show up when browsing the include file, after a bit of debugging I noticed that the main.au3 script was not being put into the "self.IncludesTable" and hence no joy. Here's a modified version of get_includes_list that makes it work fine on my end:

function MouseHoverCallTips:get_includes_list(file_path, accumulator)
    -- If file_path only contains a filename then prepend a file path
    if not string.find(file_path, "^%a:\\") then
        file_path = props["FileDir"] .. '\\' .. file_path
    end

    local file = io.open(file_path)

    if file then
        local include_name = ''
        for line in file:lines() do
            if string.len(line) > 0 then
                include_name = self:get_include_from_line(line)
                if string.len(include_name) > 0 then
                    table.insert(self.IncludesTable, include_name)
                end
            end
        end
    end
    -- new bit start
    local index = file_path:match'^.*()\\'
    local file_clean = string.sub(file_path, index+1)
    if not self:table_contains(self.IncludesTable, file_clean) then
        table.insert(self.IncludesTable, file_clean)
    end
    -- new bit end
    if accumulator == #self.IncludesTable then
        file:close()
        self.IncludesTable = self:filter_duplicate_entries(self.IncludesTable)
    end

    return true
end

On a side note: your code has helped me getting started with Lua, appreciated.

Edit: formatting redone on code paste

Edited by Sunaj

Share this post


Link to post
Share on other sites

I went ahead and posted your change without testing it because it looks good to me and I trust you.

Thanks, although practically I will have to add another bit to make the whole thing work; when I posted above code last night I forgot this little helper function which is needed to do the table_contains check:

function MouseHoverCallTips:table_contains(table, element)
for _, value in pairs(table) do
  if value == element then
   return true
  end
end
return false
end

Share this post


Link to post
Share on other sites

Fill out this template:

-- Description:
--
-- Parameters:
--       table -
--       element -
-- Author(s):
--      sunaj

Sorry, been kinda busy lately with school etc.

Edited by jaberwocky6669

Share this post


Link to post
Share on other sites

Fill out this template:

-- Description:
--
-- Parameters:
--       table -
--       element -
-- Author(s):
--      sunaj

Sorry, been kinda busy lately with school etc.

Sure, here goes (filled it in with original author's name/url for transparency):

-- Description:
--   "table_contains" returns boolean true if the value passed to it is found in the table passed to it
-- Parameters:
--   table - table to check
--   element - value to check for in table
-- Author(s):
--   Wookai (use in CalltipsOnMouseHover.lua by Sunaj)
--   url: http://stackoverflow.com/questions/2282444/how-to-check-if-a-table-contains-an-element-in-lua

Share this post


Link to post
Share on other sites

*whew* Allright, NOW! I spent literally all day chasing one pipe dream after another and now I feel confident that this works.  See >OP for more details on the latest feature!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By BugFix
      The block comment (internal: box comment) in SciTE cannot be toggled.
      I have now created a script that helps. It works with any file type for which the corresponding entries in the properties are created.For toggeling its required to detect, what the user want to do.
      Rules for detection:     - selection starts in an empty line (line break only)         following line begins with comment.box.start ==> action: uncomment         otherwise                                    ==> action: comment     - selection starts in line with text         line begins with comment.box.start           ==> action: uncomment         otherwise                                    ==> action: comment     - selection ends in an empty line AND       the line before begins with comment.box.end    ==> action: both lines are part of comment block, will deleted     - selection ends in line with comment.box.end    ==> action: line will deleted     - At least two lines must be selected, otherwise an error message is output to the console. This means that in nested block comments there is at least one more line between two comment.box.start markers.
      It is recommended to write all block comment settings into "SciTEUser.properties". The setting "comment.box.end.au3" from "SciTEGlobal.properties" is incorrect and must be corrected.
      comment.box.start.au3=#cs #~ If TAB should used as box.middle, define an alternation (e.g. "@Tab"),  #~ "\t" will not recognised as tab if passed as propertie. comment.box.tab.alternation= #~ If you want characters or tab in each line of comment block, define it here. #~ To use TAB, set the alternation variable here: $(comment.box.tab.alternation) comment.box.middle.au3= comment.box.end.au3=#ce Connection to SciTE
      Search a free command number. Use a Hotkey of your choice.
      If you have declared an option for user lua scripts (e.g.: "Lua.User.Scripts.Path=C:\code\lua"), copy the script to this folder.
      Otherwise copy it to a folder of your choice and change the path in the command: "dofile". But backslashes in the path must be masked. ("\\").
      If your path has spaces don't forgot to encapsulate in string delimiters.
      # 24 Toggle Block Comment command.name.24.*=Toggle Block Comment command.24.*=dofile $(Lua.User.Scripts.Path)/BlockComment.lua command.mode.24.*=subsystem:lua,savebefore:no command.shortcut.24.*=Ctrl+Alt+F10  
      Here the lua script:
      -- TIME_STAMP 2020-10-04 18:56:11 v 0.5 --[[ Toggle Block Comments ©BugFix ( autoit[at]bug-fix.info ) For toggeling its required to detect, what the user want to do. Rules for detection: - selection starts in an empty line (line break only) following line begins with comment.box.start ==> action: uncomment otherwise ==> action: comment - selection starts in line with text line begins with comment.box.start ==> action: uncomment otherwise ==> action: comment - selection ends in an empty line AND the line before begins with comment.box.end ==> action: both lines are part of comment block, will deleted - selection ends in line with comment.box.end ==> action: line will deleted - At least two lines must be selected, otherwise an error message is output to the console. Properties: It is recommended to write all block comment settings into SciTEUser.properties. The setting "comment.box.end.au3" from "SciTEGlobal.properties" is incorrect and must be corrected. comment.box.start.au3=#cs #~ If TAB should used as box.middle, define an alternation (e.g. "@Tab"), #~ "\t" will not recognised as tab if passed as propertie. comment.box.tab.alternation= #~ If you want characters or tab in each line of comment block, define it here. #~ To use TAB, set the alternation variable here: $(comment.box.tab.alternation) comment.box.middle.au3= comment.box.end.au3=#ce ]] local BlockComment = { -- variables ext, -- file extension boxStart, -- property: comment.box.start boxMiddle, -- property: comment.box.middle boxEnd, -- property: comment.box.end bMiddle, -- bool: boxMiddle is defined selStart, -- selection start position selEnd, -- selection end position lineStart, -- selection start line number lineEnd, -- selection end line number newText, -- the text that replaces the selection Init = function(self) self.ext = props["FileExt"] self.boxStart = props["comment.box.start."..self.ext] self.boxMiddle = props["comment.box.middle."..self.ext] local tabAlternation = props["comment.box.tab.alternation"] if tabAlternation ~= "" and self.boxMiddle == tabAlternation then self.boxMiddle = "\t" end self.boxEnd = props["comment.box.end."..self.ext] self.bMiddle = not (self.boxMiddle == "") self.selStart = editor.SelectionStart self.selEnd = editor.SelectionEnd self.lineStart = editor:LineFromPosition(self.selStart) self.lineEnd = editor:LineFromPosition(self.selEnd) self.newText = "" end, -- create the line w/wo middle markers NewLine = function(self, _num, _uncmt) local line = editor:GetLine(_num) if _uncmt then -- if second last line has box.end AND last line is empty OR if (_num == self.lineEnd -1 and self:LineIsEnd(_num) and self:LineIsEmpty(_num +1)) or -- if is the last line AND its empty --> stop proceeding (_num == self.lineEnd and self:LineIsEmpty(_num)) then return "" else -- if box.middle exists --> remove it if self.bMiddle then line = line:sub(self.boxMiddle:len()+1) end end else -- add box.middle if exists line = self.boxMiddle..line end return line end, -- checks if line is empty (has only a line break) LineIsEmpty = function(self, _lineNum) return (editor:GetLine(_lineNum) == "\r\n") end, -- checks if line has box.start LineIsStart = function(self, _lineNum) local line = editor:GetLine(_lineNum) return ( line:sub(1, self.boxStart:len()):lower() == self.boxStart:lower() ) end, -- checks if line has box.end LineIsEnd = function(self, _lineNum) local line = editor:GetLine(_lineNum) return ( line:sub(1, self.boxEnd:len()):lower() == self.boxEnd:lower() ) end, -- returns "false" if none error ErrorCheck = function(self) if self.selStart == self.selEnd then print("! NONE SELECTION.") return true elseif self.boxStart == "" or self.boxEnd == "" then print("! ERROR - The comment.box properties for *."..self.ext.." files are missing or incomplete.") return true elseif self.lineStart == self.lineEnd then print("! SINGLE LINE SELECTION. USE LINE COMMENT INSTEAD.") return true else return false end end, -- creates the text to toggle and replace the selection with it Toggle = function(self) self:Init() if self:ErrorCheck() then return end local uncomment = false local skip = 0 -- proceed with first line -- if start position is in empty line AND next line has box.start --> uncomment the block if self:LineIsEmpty(self.lineStart) and self:LineIsStart(self.lineStart +1) then uncomment = true skip = 1 -- the following line will ignored now -- if line from start position has box.start --> uncomment the block elseif self:LineIsStart(self.lineStart) then uncomment = true -- in other cases comment the block else -- insert box.start before the first line; if box.middle exists --> insert it too self.newText = self.boxStart.."\n"..self.boxMiddle..editor:GetLine(self.lineStart) end -- proceed with middle lines -- if box.middle is defined set/replace it in line local n = self.lineStart + 1 + skip local line while n < self.lineEnd do self.newText = self.newText..self:NewLine(n, uncomment) n = n + 1 end -- proceed with last line line = editor:GetLine(self.lineEnd) if not uncomment then self.newText = self.newText..self.boxMiddle..line..self.boxEnd else -- if uncomment the last line will ignored, but the trailing "\r\n" must deleted self.newText = self.newText:sub(1, -3) end -- replace the selection with the new toggled text editor:ReplaceSel(self.newText) end } BlockComment:Toggle() As far as I know, it is not possible to overwrite SciTE internal hotkeys. In this case "Ctrl+Shift+B" for IDM_BLOCK_COMMENT. Therefore I used the connection shown here.
      But if overwriting is possible, I would be interested in this solution.
      BlockComment.lua
    • By Bhooshan
      I need to mute an ongoing call on Microsoft teams without activating the window. Teams allows us to mute using shortcut key Ctrl+Shift+m but only when the window is active.
      # Used set option as ongoing call can be with any person which leads to change in Title Name.
      AutoItSetOption ( "WinTitleMatchMode", 2 ) 
      # I am not clear with the control ID which will be good to use here and also the key combination of ^M       
      ControlSend ( "Microsoft Teams", "", "[CLASS:Intermediate D3D Window; INSTANCE:1]", "{ctrl down}")
       
      Can anyone help...!!! 
       

    • By Sayed
      Hi there, 
      I'm new in AutoIt forms and using AutoIt to automate desktop application (able to automate the application normally but facing issue when I've to re-run the application twice within the same script...so need help in this please)
      here is the steps then followed by the issue in a brief : 
      1- run application . 
      2- do some actions (click menus,activate windows,set texts..)
      3- close the application. 
      4- run the application again & access the same controls.
      5- open the same windows again (like step 2)
      6- perform some validations (by getting texts from some text boxes)
      7- close the application again (and repeat 1-7 for 15 times in average )
      The issue 
      * all controls are accessible in the first run and actions done successfully on controls (for steps 1-3) BUT from the second run of the application from step-4 it's able to set focus only the main application window.
      Note: only unique properties used to while mapping the controls. 
      Error that appear in the console :
      UIAWrappers.au3" (1673) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: $x = Int($t[1] + ($t[3] / 2)) $x = Int($t[1] + (^ ERROR  
      Simple spy code  of one of the controls that has this strange issue(menubar&view menu Item): 
      ;~ *** Standard code maintainable *** #include "UIAWrappers.au3" AutoItSetOption("MustDeclareVars", 1) _UIA_setVar("oP1","Title:=XXX;controltype:=UIA_WindowControlTypeId;class:=WindowsForms10.Window.8.app") ;main app form xxx _UIA_setVar("oP2","Title:=menuStrip1;controltype:=UIA_MenuBarControlTypeId;class:=WindowsForms10.Window.8.app") ;menuStrip1 ;~ $oUIElement=_UIA_getObjectByFindAll("View.mainwindow", "title:=View;ControlType:=UIA_MenuItemControlTypeId", $treescope_subtree) _UIA_setVar("oUIElement","Title:=View;controltype:=UIA_MenuItemControlTypeId;class:=") ;ControlType:=UIA_MenuItemControlTypeId;classname:=") ;~ Actions split away from logical/technical definition above can come from configfiles ;~_UIA_Action("oP1","highlight") _UIA_Action("oP1","setfocus") ;~_UIA_Action("oP2","highlight") _UIA_Action("oP2","setfocus") _UIA_action("oUIElement","highlight") ;~_UIA_action("oUIElement","click")  
       
    • By Fenzik
      Hello All!
      i suggest to set default encoding in Scite4 for Autoit 3 to UTF 8 with Bom encoding, format recommended also in Autoit Help.
      In last editor version, when i open new script, for example Czech characters (č, ř, ž) aren't correct.
      So when i change Encoding to UTF 8 with Bom from Default Code page property state, everithing seems to be OK.
      Thank you and sorry for potentialy duplicated content.
      Fenzik
    • By matwachich
      AutoIt3 Lua Wrapper
      This is an AutoIt3 wrapper for the Lua scripting language. Consider it beta software, but since I will be using it in commercial product, expect it to evolve.
      It has been developped with Lua 5.3.5. Updates will come for new Lua version.
      Everything works just fine, except one (big) limitation: Anything that throws a Lua error (using C setjmp/longjmp functionality) will crash your AutoIt program. That means that it is impossible to use throw errors from an AutoIt function called by Lua (luaL_check*, lua_error...).
      It is hosted in Github: https://github.com/matwachich/au3lua
      Simple example
      #include <lua.au3> #include <lua_dlls.au3> ; Initialize library _lua_Startup(_lua_ExtractDll()) OnAutoItExitRegister(_lua_Shutdown) ; create new execution state $pState = _luaL_newState() _luaopen_base($pState) ; needed for the lua's print function $iRet = _luaL_doString($pState, 'print("Hello, world!")') If $iRet <> $LUA_OK Then ; read the error description on top of the stack ConsoleWrite("!> Error: " & _lua_toString($pState, -1) & @CRLF) Exit EndIf ; close the state to free memory (you MUST call this function, this is not AutoIt's automatic memory management, it's a C library) _lua_close($pState)
×
×
  • Create New...