Ru-Board.club
← Вернуться в раздел «Программы»

» CintaNotes

Автор: Romaxin65
Дата сообщения: 20.03.2015 10:06

Цитата:
Стандартный Ctrl+F6, как в Word'е   Пока не занято - подойдет, спасибо.

А для случая, когда мышка в руке, было бы удобно это делать покручивая колесико, при зажатой правой кнопке.
Автор: jenter
Дата сообщения: 23.03.2015 08:37
rsuan

Цитата:
Да, я об этом тоже подумал, меня это тоже смущает Фокусировать не надо, пусть выскакивает полупрозрачная маленькая надпись "Тег передан в открытое окно заметки" и тухнет через секунду-две.

Сложновато получается. Думаю оптимально было бы обновлять и заметку в базе, и сразу же открытую на редактирование копию.

Romaxin65

Цитата:
Этот подход контрИнтуитивен, и только сбивает с толку, ведь Сколько какой тег имеет заметок, всегда можно глянуть, нажав на тег ВСЕ

Есть тут еще кто-нибудь, кто думает так же (кроме ViCin)?


Цитата:
Мне кажется самым наглядным будет, если(в любом режиме отображения тегов), справа, там где сейчас(Со стороны ленты) будет показываться количество отображеннх заметок, а слева, от границы окна все заметки которые имеет тег.

Там, где сейчас что? Не понятно. Перефразируйте пожалуйста.

ViCin

Цитата:
Да, так как будто логичнее и полезнее, возможностей больше. Но может быть, лучше бы сделать настраиваемо - либо так, либо иначе. А по умолчанию я бы предпочел вариант Romaxin65.

Считаю, что счетчики должны работать одинаково независимо от режима отображения списка тегов (в самом деле, почему фильтрация тегов должна влиять на "количество использований"?)
То есть мы договариваемся, что цифра всегда означает, сколько заметок ИЗ ОТОБРАЖАЕМЫХ В ДАННЫЙ МОМЕНТ имеют этот тег (а не сколько заметок ВООБЩЕ, как сейчас).

Так что учтите, что в варианте Romaxin65 счетчики будут дико "скакать" - выделение любого тега приведет к пересчету почти всех счетчиков, причем большая часть будут показывать 0. В каком-то смысле счетчики будут дублировать синюю подсветку тегов - синими будут теги с ненулевым счетчиком.

Romaxin65

Цитата:
А для случая, когда мышка в руке, было бы удобно это делать покручивая колесико, при зажатой правой кнопке.

Эта функция больше подходит для переключения секций.
Автор: ViCin
Дата сообщения: 23.03.2015 08:58
jenter

Цитата:
Так что учтите, что в варианте Romaxin65 счетчики будут дико "скакать" - выделение любого тега приведет к пересчету почти всех счетчиков, причем большая часть будут показывать 0. В каком-то смысле счетчики будут дублировать синюю подсветку тегов - синими будут теги с ненулевым счетчиком.

Да, что-то уж слишком. Наверно, не надо так делать. Беру слова обратно.
Автор: StanislawK
Дата сообщения: 23.03.2015 12:25
jenter

Цитата:
Считаю, что счетчики должны работать одинаково независимо от режима отображения списка тегов (в самом деле, почему фильтрация тегов должна влиять на "количество использований"?)
То есть мы договариваемся, что цифра всегда означает, сколько заметок ИЗ ОТОБРАЖАЕМЫХ В ДАННЫЙ МОМЕНТ имеют этот тег (а не сколько заметок ВООБЩЕ, как сейчас).

Это получится какой то цирк. то пять то восемь.

Сейчас оно показывает именно то что должно, и менять это не нужно.


Цитата:
Так что учтите, что в варианте Romaxin65 счетчики будут дико "скакать"


Я категорически против этого варианта.
Автор: rsuan
Дата сообщения: 23.03.2015 18:57
jenter
Цитата:
Думаю оптимально было бы обновлять и заметку в базе, и сразу же открытую на редактирование копию.

Действительно, так и надо. Только чтоб любые несохранённые изменения в открытой заметке при этом не сохранялись.

Автор: Romaxin65
Дата сообщения: 23.03.2015 19:17

Цитата:
выделение любого тега приведет к пересчету почти всех счетчиков, причем большая часть будут показывать 0.

А зачем их показывать: ноль он и есть ноль.
Цитата:
синими будут теги с ненулевым счетчиком.  

именно: если выбран хоть один тег, это говорит о том, что все отсеянное стало неинтересным - отсев он и есть отсев, что в нем ковыряться.

Добавлено:
А если нужно знать сколько всего заметок имеет каждый тег, то жмем на тег ВСЕ и любуемся.
Автор: StanislawK
Дата сообщения: 23.03.2015 19:28
Romaxin65

Цитата:
именно: если выбран хоть один тег, значит все отсеянное стло неинтересным - отсев он и есть отсев, что в нем ковыряться.

Добавлено:
А если нужно знать сколько всего заметок имеет каждый тег, то жмем на тег все и любуемся.

теги удобно использовать для быстрого перехода между заметками. в один клик.

знать сколько всего заметок с таким тегом, интересно, но не важно. важно видеть [все] теги одновременно.
Автор: Romaxin65
Дата сообщения: 23.03.2015 20:02

Цитата:
Не понятно. Перефразируйте пожалуйста.

[more=Подробнее]Я про две колонки счетчиков, но смотрится громозко: слишком много щума(неактуальной информаии), что не способствует концентрации
[/more]
Автор: jenter
Дата сообщения: 28.03.2015 16:54
rsuan

Цитата:
Действительно, так и надо. Только чтоб любые несохранённые изменения в открытой заметке при этом не сохранялись.

Разумеется.

Romaxin65

Цитата:
именно: если выбран хоть один тег, это говорит о том, что  все отсеянное стало неинтересным - отсев он и есть отсев, что в нем ковыряться.

Да, но пропала возможность в один клик переключиться на другой тег.


Цитата:
А если нужно знать сколько всего заметок имеет каждый тег, то жмем на тег ВСЕ и любуемся.

Это дополнительное действие. Тоже ведь можно сказать: если нужно знать, сколько заметок из отобранных имеет какой-то тег, то просто добавляем этот тег в выборку через Ctrl+клик и смотрим на счетчик в правом верхнем углу.

В общем предложение неоднозначное. И та, и другая информация могут быть полезны, но выводить все - громоздко. Может менять вид счетчиков при нажатии на Ctrl (еще до клика)?

Добавлено:
StanislawK

Цитата:
теги удобно использовать для быстрого перехода между заметками. в один клик.
 
знать сколько всего заметок с таким тегом, интересно, но не важно. важно видеть [все] теги одновременно.


Видите, я об этом и говорил.

Добавлено:
Romaxin65

Цитата:
Подробнее [?

Спасибо. Думаю, что вариант с изменением вида счетчиков по нажатию Ctrl решает все проблемы.
Автор: yngvar
Дата сообщения: 04.04.2015 09:14
А ожидается поддержка подсветки кода в заметках?
Автор: Romaxin65
Дата сообщения: 04.04.2015 10:32
jenter

Цитата:
пропала возможность в один клик переключиться на другой тег

И куда она пропала? Все теги по прежнему на своих местах -переключайся не хочу.

Цитата:
если нужно знать, сколько заметок из отобранных имеет какой-то тег, то просто добавляем этот тег в выборку через Ctrl+клик и смотрим на счетчик в правом верхнем углу.

И что там увидем? Именно: сколько заметок из отобранных имеет какой-то тег
Если не сложно скриншот.

Цитата:
Видите, я об этом и говорил

Если об этом:

Цитата:
знать сколько всего заметок с таким тегом, интересно, но не важно

Так и я про тоже: зачем отображать счетчик сколько всего заметок с таким тегом в базе, это на самом деле не очень важно.
А вот здесь не ясно:

Цитата:
важно видеть [все] теги одновременно.

что этому препятствует?





Добавлено:
jenter
Думаю будет хорошим решением, если в контекстном меню панели тегов, при активации пункта "Показывать счетчики использования" Синта будет считатаь именно используемые заметки(из ленты), а при снятии галочки - все заметки базы для каждого тега, как это сделано сейчас.
Автор: Krot66
Дата сообщения: 08.04.2015 15:22
CN Organizer - скрипт Autohotkey, расширяющий функции CintaNotes


Помимо исправленных багов и улучшенной совместимости с программами, по сравнению со старой версией изменения в следующем:

1. Добавлена возможность оптического распознавания текста с помощью Tesseract OCR, дающая возможность делать заметки из лишенных текстового слоя pdf и djvu книг, защищенных от копирования документов и страниц, текстовых картинок и пр.. Качество распознавания довольно приличное, поддерживаются двуязычные тексты. Для улучшения рекомендуется использовать естественный масштаб документа и выделение текста с минимальными полями. Качество распознавания резко падает при обработке менее пяти-шести строк текста, поэтому часто бывает лучше не экономить на выделении, а после удалить лишнее.

Помимо CintaNotes, скрипт может быть использован как простое и удобное приложение для распознавания скриншотов, поиска и перевода полученного текста, имеющее ряд дополнительных возможностей.

Как это работает. Зажимая Shift, щелкаем средней кнопкой мыши. Под курсором появляется прямоугольное полупрозрачное окошко. Перетаскивая его мышью и масштабируя за углы и края, накрываем интересующий участок текста. Щелчок правой кнопкой мыши по окну выделения - подтверждение, Escape или щелчок правой кнопкой вне окна - отмена операции.
После секундного размышления появляется окно с распознанным текстом:



Здесь:
Search - поиск выделенного текста в Google.

Translate - отправка всего текста в Google Translate.

RUS+ENG - выпадающее меню наборов языков распознавания. Можно создавать собственные наборы языков из числа имеющихся языковых пакетов (смотри "Настройки OCR" скрипта). Выбор другого языка перезапускает процесс распознавания и сохраняется до следующего запуска.

Add to next - запоминает распознанный текст и добавляет его автоматически при следующем распознавании. Это позволяет собирать в одну заметку текст из нескольких кусков, что удобно, например, при конспектировании или обработке текста, расположенного на границе двух страниц, где распознавание в один прием невозможно.

Delete old - удаляет старые, созданные клавишей Add to next фрагменты и оставляет только текущий.

OCR history - выпадающее меню, в котором можно скопировать в буфер любой из распознанных с момента запуска скрипта фрагментов.

Sep - чекбокс, управляющий удалением разделителей фрагментов, имеющих вид "### Дата Время Имя документа или страницы ###". По умолчанию (это можно изменить в настройках) при копировании или создании заметки разделители удаляются и фрагменты идут встык. При конспектировании их можно оставить для разделения цитат и указания источников.

Undo - возвращает окно к виду, бывшему при последнем закрытии.

Copy - копирование текста окна.

CintaNotes - отправляет распознанный текст в новую заметку CintaNotes с оригинальным заголовком, при этом окно c распознанным текстом закрывается автоматически. (Тот же результат дает нажатие Ctrl+F12). Нажатие RShift+F12 открывает его вновь с текстом, бывшем в нем на момент закрытия.

Если при открытом окне распознавания использовать скриптовое сочетание клавиш (RCtrl+RShift+клавиша), будет создана заметка в оответствии со связанными с клавишей правилами. При этом сгенерированные переменные ($title, $cmd, $cmt, $proc) будут относиться к исходному окну распознаваемого документа.

Собранный набор скрипт+Tesseract OCR с 5-ю великими европейскими языками можно скачать здесь

Чтобы сделать все самостоятельно, идем сюда, качаем tesseract-ocr-3.02-win32-portable.zip и потребные языковые пакеты. Распаковываем дистрибутив и помещаем папку Tesseract-OCR в каталог скрипта. В нее же распаковываем архивы языковых пакетов. Если удалить множество ненужных файлов и папок, в итоге должно получиться дерево примерно такого вида:

|-- Tesseract-OCR <DIR>
| |-- tessdata <DIR>
| | |-- deu.traineddata
| | |-- eng.traineddata
| | |-- fra.traineddata
| | |-- rus.traineddata
| | |-- spa.traineddata
| |-- tesseract.exe
|-- CN Organizer.ahk

2. Добавлен функционал для изучения языков (собственные словари изучаемых слов и словосочетаний), а так же алфавитных каталогов
терминов, энциклопедических статей и пр..
Для этого используется переменная $dict. При ее использовании начальная часть статьи идет в заголовок заметки, а сама переменная заменяется первой буквой в верхнем регистре. Так если добавить в конфигурационный файл строку "1,English/%dict,F5", при нажатии RCtrl+RShift+F5 из словарной статьи со словом godspeed в 1-й секции будет создана заметка с заголовком godspeed и тэгом English/G.
Имеет смысл выделить для таких каталогов отдельную секцию с сортировкой заметок по алфавиту.

ВАЖНО: для правильного отображения знаков транскрипции следует открыть файл настроек cintanotes.settings (каталог скрипта для портативной версии или Application Data\CintaNotes для инсталлятора) и в параметре app.mainframe.notetextfont заменть Verdana на Tahoma или любой другой шрифт, установленный в системе и имеющий соответствыющий набор символов.

[more=Скрипт]

Код:
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
Menu, Tray, Icon, shell32.dll, 21
CoordMode Mouse
CoordMode ToolTip
goto Start

; Настройки горячих клавиш программы должны быть: Ctrl+F12 - создание, CTRL+ALT+F12 - показать главное окно.
; В Настройках - Захват текста - После захвата должно стоять "Открыть на редактирование"

; Скрипт связывает клавишу с номером (существующей!) вкладки и набором тэгов. Комбинация RCtrl+RShift+клавиша создает заметку, RCtrl+RAlt+клавиша - открывает соответствующую вкладку и тэг.

; При запуске в каталоге скрипта создается одноименный cfg-файл, задающий эти соответствия.
;             Синтаксис строк предельно прост:
;     номер секции,тэг или набор тэгов,имя клавиши или ее код (виртуальный или скан),пояснение (необязательно).

;     Например:
;    1,,1 - первая секция без тэга по 1 (строки такого вида добавляются автоматически)
;    1,Comp,vk43,c - тэг Comp в первой секции по клавише c
;     1,Soft Comp,vk53,s - два тэга там же по s
;     1,Books/читать,sc30,b - дочерний тэг "читать" в Books по b
; 1,Книги Books/читать,F6 - комбинация двух предыдущих возможностей по F6 (использование "," и ";" как разделителя не допускается - только пробел)

; Для применения изменений следует перезапустить скрипт!

;~ Кроме постоянных значений, для записи в тэг возможно использование следующих переменных:

;~ $time - при создании заметки выводится окно ввода даты и времени с календарем, которые подставляются в тэг (8,Дела/$time,vkC0,~)
;~ $site - подставляет в тэг корневой адрес сайта, открытого в браузере
;~ $cmd - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы.
;~ $title - название или имя файла без расширения, взятое из заголовка окна; ищет там и полный путь.
;~ $cmt - переменная, совмещающая возможности двух предыдущих: сначала ищется путь файла в командной строке, а если он отсутствует, используется заголовок окна.
;~ $file - файл под курсором в проводнике или файловом менеджере
;~ $proc - имя процесса активного окна без расширения
;~ $dict - создание алфавитных каталогов. Текст из начала заметки идет в заголовок, переменная заменяется его начальной буквой в верхнем регистре(например, при записи 1,English/%dict,F5, слово godspeed по F5 получит тэг English/G)
;~ $z - наличие в любом месте автоматически сохраняет заметку и закрывает окно с секундной задержкой

; В файле конфигурации допускаются пустые строки, лишние пробелы - только в пояснениях. Временно ненужное можно закоментировать ";".

; --------- Горячие клавиши ----------
; В открытом окне заметки:
; RCtrl+клавиша - замена секции и тэга данными, связанными с клавишей
; RShift+клавиша - дополнение текущего тэга связанным с клавишей (производится проверка, связан ли он с текущей секцией)
; По L/RCtrl+Space и L/RShift+Space - добавляются настраиваемые тэги, суффиксы или дочерние тэги (см. ниже)
; Чтобы сделать заметку из распознанного текста, зажимаем Shift и щелкаем средней кнопкой мыши. Под курсором появляется прямоугольное полупрозрачное окошко.Перетаскивая его мышью и масштабируя за углы и края, накрываем интересующий участок текста. Щелчок правой кнопкой мыши по окну выделения - подтверждение, Escape или щелчок правой кнопкой вне окна - отмена операции. Далее делается заметка клавишей CintaNotes или скриптовым сочетание клавишю
;~ RShift+F12 - открытие интерфейса программы с текстом, бывшим в момент закрытия.

>^>+F12::Run % "Notepad.exe " cfg ; RCtrl+RShift+F12 - окрытие конфигурационного файла

>^>+Space::goto Last_add ; RCtrl+RShift+Space - создание заметки в той же секции и с теми же тэгами, что и в последний раз

$>^>!Space::goto Last_open ; RCtrl+RAlt+Space - открытие последних созданных заметок

; -------- Мышь (в главном окне программы) --------
#IfWinActive ahk_class CintaNotes.MainFrame
MButton::Send {LButton}{F7} ; Cредняя кнопка - открытие ссылки заметки под курсором
#IfWinActive
Start:

;------------ Настройки скрипта -------------
ctrl_tag:="_ToDo" ; Суффикс, прописывающийся при секундном зажатии правого Ctrl в тэг при создании заметки. Если вписать " ToDo", будет добавляться дополнительный тэг, если "/ToDo" - дочерний

lctrl_space:="_rem" ; суффикс, дополнительный или дочерний тэг дописывающийся к текущему тэгу по LCtrl+Space в окне редактирования

rctrl_space:="_ToDo" ; то же для RCtrl+Space

lshift_space:=" !Смотреть" ; то же для LShift+Space

rshift_space:="_Old" ; то же для RShift+Space

t_tree:="yyyy_MM/dd_dddd" ; комбинация, подставляющаяся в тэг вместо даты при использовании $time. Определяет вид дерева дат в боковой панели

dir_path:=0 ; при использовании $cmd, $title, $cmt и $file создавать ссылку на каталог вместо ссылки на файл

max_empty_str:=2 ; максимальное число последовательных пустых строк в скопированном в заметку тексте

end_note:="Больше информации на http|Читайте далее: http|Читать далее: http|Подробности: http|Источник: http" ; начала обрезаемых хвостов, добавляемых при копировании текста скриптами на веб-страницах, разделенные "|"

clip:=2 ; сохранять в буфере обмена после создания заметки: 1 - текст заметки, 2 - первую непустую строку в виде, пригодном для переименования файлов (заметки о файлах, ставящихся на закачку); 0 - прежнее содержимое

link2rem:=1 ; копировать адреса и пути из раздела ссылки в примечания

;------------ Настройки OCR -------------
; Наборам языков сопоставляются переменные lng_%n%, отображаемые в выпадающем меню. Коды языков соответствуют именам файлов языковых пакетов в папке tessdata. Не более 2-х языков одновременно через "+".
lng_1:="rus+eng" ; дефолтный язык распознавания
lng_2:="rus"
lng_3:="eng"
lng_4:="deu"
lng_5:="fra"
lng_6:="spa"

opaque:=130 ; непрозрачность окна выделения текста (1-255)

color:="FFDC00" ; его цвет

ft:=16 ; размер шрифта окна распознанного текста

sep:=0 ; сохранение разделителей фрагментов по умолчанию

search:="https://www.google.ru/search?client=opera&q=%s&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest&gws_rd=ssl" ; строка поиска текста

translate:="www.translate.google.com/#auto|ru|%s" ; строка перевода текста

;-----------------------------------------------
SysGet, M, MonitorWorkArea
text:="", lng:=lng_1
history:="OCR history" A_Tab . A_Tab
SplitPath A_ScriptName, , , , cfg
cfg:=cfg ".cfg"
IfNotExist % cfg
    FileAppend , % "1,,1`r`n2,,2`r`n3,,3`r`n4,,4`r`n5,,5`r`n6,,6`r`n7,,7`r`n8,,8`r`n9,,9`r`n0,,0", % cfg, utf-8
Loop Read, % cfg
{
    If A_LoopReadLine contains `;
        continue
    If A_LoopReadLine=`r`n
        continue
    Loop Parse, A_LoopReadLine, CSV
    {
        If (A_Index=1)            
            tab:=A_LoopField
        If (A_Index=2)
            tag:=A_LoopField    
        If (A_Index=3)
            key:=A_LoopField
    }
    tab_%key%:=tab
    tag_%key%:=tag
    Hotkey % ">^>+" key, Note
    Hotkey IfWinActive, ahk_class Cinta.ModelessDialog
    Hotkey % ">^" key, Note
    Hotkey % ">+" key, Note
    Hotkey IfWinActive
    Hotkey % ">^>!" key, Open
}
n:=1, lng_string:=lng_1
Loop
{
    n+=1
    If lng_%n%
        lng_string.=A_Tab . lng_%n%     
    If (n>20)
        break
}
return

#IfWinActive ahk_class Cinta.ModelessDialog
<^Space::Addtag(lctrl_space)
>^Space::Addtag(rctrl_space)
<+Space::Addtag(lshift_space)
>+Space::Addtag(rshift_space)
#IfWinActive

Addtag(tt)
{
    KeyWait Ctrl, T1
    KeyWait Shift, T1
    ControlGetText tag, Cinta.Edit2
    s:=SubStr(tag,0)
    If (s=" ")
        StringTrimRight tag, tag, 1
    ControlSetText Cinta.Edit2, % tag . tt " "
    Send {End}
    return
}
;------------------------------------------------
>+F12::
text:=undo_text
goto Int

+MButton::
start_key:=2
WinGetActiveTitle source_title
WinGet, source_id, ID, A
ToolTip Правый клик в области выделения - подтверждение`nEscape или правый клик вне области выделения - отмена, % MRight*0.4, 0
MouseGetPos mx, my
w:=MRight//5, h:=w//4, x:=mx-w//2, y:=my-h//2
Gui Destroy        
Gui +Lastfound +Resize AlwaysOnTop -Caption +Border +ToolWindow -DPIScale +MinSize60x20        
Gui Color, % color
Gui, Add, Text, w%w% h%h% guiMove
WinSet Transparent, % opaque    
Gui, Show, x%x% y%y% w%w% h%h%, select_ocr_area
While WinExist("select_ocr_area")
{
    WinGetPos, , , ww, wh
    GuiControl, Move, Static1, w%ww% h%wh%
    Sleep 50
}
return

#IfWinActive select_ocr_area ahk_class AutoHotkeyGUI
RButton::
KeyWait RButton, T1
Tooltip
WinGetPos sx, sy, sw, sh, select_ocr_area
MouseGetPos mx, my
If (mx>sx && mx<sx+sw && my>sy && my<sy+sh)
{
    Gui Destroy
    ToolTip
    goto OCR
}
GuiEscape:
Gui Destroy
Tooltip
return
#IfWinActive ahk_class AutoHotkeyGUI
^F12::goto 2ButtonCintaNotes
#IfWinActive

uiMove:
PostMessage, 0xA1, 2,,, A
return

OCR:
CaptureScreen(sx "|" sy "|" sw "|" sh,"ocr.png", 0, 0)
Recogn:
ToolTip Распознаю..., MRight/2, MBottom/2
RunWait % "Tesseract-OCR\tesseract.exe ocr.png ocr -l " lng, ,Min
ToolTip
Sleep 200
FileEncoding UTF-8-RAW
FileRead text, ocr.txt

text:=RegExReplace(text,"m)^(\s+|:|;|!|\?|\|)")
text:=RegExReplace(text,"m)A_Space+$")
text:=RegExReplace(text,"\s+$")
text:=RegExReplace(text,"\R{2,}","`r`n")
text:=RegExReplace(text,"(\.|,|:|;)(,|:|;)","$1")
text:=RegExReplace(text," {1,3}(\.|,|:|;|!|\?|\)|]|})","$1")
text:=RegExReplace(text,"(\.|,|:|;|!|\?)A_Space{2,3}","$1A_Space")
text:=RegExReplace(text,"(\[|\{|\()A_Space{1,3}","$1")

history:=text . A_Tab . history
FormatTime dt, , dd.MM.yyyy HH:mm
text:="`r`n### " dt " " CleanTitle(source_title,80) " ###`r`n" text "`r`n"
text:=RegExReplace(old_text . text,"^\s+")
Int:
ed_w:=940+(MRight-1000)*0.25, ed_h:=MBottom*0.6, b_w:=(ed_w-64)//6, h_w:=b_w*3, u_w:=b_w//2, c_w:=u_w-8
Gui 2:Destroy
Gui 2:-DPIScale +DelimiterTab
Gui 2:Color, D7D7D7
Gui 2:Margin , 24
Gui 2:font, s%ft%, Arial
Gui 2:Add, Edit, vtext w%ed_w% h%ed_h%,% text
Gui 2:font
Gui 2:font, s12
Gui 2:Add, Button, x60 y+8 w%b_w% h36 section, Canc&el    
Gui 2:Add, Button, x+0 wp hp, &Search
Gui 2:Add, Button, x+0 wp hp, &Translate
Gui 2:Add, DDL, x+0 yp+1 wp Sort Choose1 Uppercase vlng glng, % lng_string    
Gui 2:Add, Button, x+0 yp-1 wp h36, &Add to next
Gui 2:Add, Button, x+0 wp hp, Cinta&Notes
Gui 2:Add, DDL, x60 y+6 xs w%h_w% vhist gHistory, % history
Gui 2:Add, Checkbox, x+8 yp-1 w%c_w% h36 vsep Checked%sep%, &Sep
Gui 2:Add, Button,x+0 w%u_w% hp, &Undo
Gui 2:Add, Button, x+0 w%b_w% hp, Delete old
Gui 2:Add, Button, x+0 wp hp, &Copy    
Gui 2:Show, Center, % source_title    
GuiControl 2:ChooseString, ComboBox1, % lng
Send ^{End}
return

2ButtonCancel:
2GuiEscape:
2GuiClose:
Gui 2:Submit
undo_text:=text
FileDelete ocr.*
return

2ButtonSearch:
Gui 2:Submit, NoHide
ControlGet text, Selected, ,Edit1
If !text
{
    MsgBox, 262160, Ошибка, Ничего не выделено!, 1
    return
}
url:=search
StringReplace url, url, http://
StringReplace url, url, https://
url:="http://" url
StringReplace url, url, `%s, % text
Run % url
text:=""
return

2ButtonTranslate:
Gui 2:Submit, NoHide
text:=RegExReplace(text,"\R?### .+? ###\R","")
url:=translate
StringReplace url, url, http://
StringReplace url, url, https://
url:="http://" url
StringReplace url, url, `%s, % text
Run % url
return

lng:
Gui 2:Submit
If !text
    return
text:=RegExReplace(text,"^.*###\R","")
history:=text . A_Tab . history
goto Recogn

2ButtonUndo:
Gui 2:Submit, NoHide
If !undo_text
    return
text:=RegExReplace(undo_text,"\R","`r`n")
ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
return

Sep:
sep:=!sep
return
    
2ButtonAddtonext:
Gui 2:Submit
undo_text:=old_text:=text
FileDelete ocr.*
return

2ButtonCintaNotes:
Gui 2:Submit, NoHide
undo_text:=text, old_text:=""
KeyWait LButton, T1
text:=RegExReplace(text,"^\R+")
If !sep
    text:=RegExReplace(text,"\R?### .+? ###\R","")
text:=RegExReplace(text,"\R","`r`n")
ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
ControlFocus Edit1
ControlSend Edit1, ^{vk41}
FileDelete ocr.*
KeyWait Ctrl, T1
Send ^{F12}
WinWaitActive ahk_class Cinta.ModelessDialog, , 10
Sleep 1000
Gui 2:Submit
return

2ButtonDeleteold:
Gui 2:Submit, NoHide
text:=RegExReplace(text,"^.*(?=\R?### .+? ###)","")
text:=RegExReplace(text,"\R","`r`n")
ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
old_text:=""    
return

History:
Gui 2:Submit, NoHide
Clipboard:=hist
GuiControl Choose, ComboBox2, OCR history
ToolTip Текст в буфере!
Sleep 700
ToolTip
return

2ButtonCopy:
Gui 2:Submit, NoHide
text:=RegExReplace(text,"^\R+")
If !sep
    text:=RegExReplace(text,"\R?### .+? ###\R","")
Clipboard:=text
ToolTip Тект в буфере!
Sleep 700
ToolTip
return

;---------------------------------
Note:
KeyWait RShift, T1
KeyWait RCtrl, T0.7
ctrl_delay:=ErrorLevel

clip_old:=Clipboard, old_tag:="", site_add:="", site_text:=""
IfWinActive select_ocr_area ahk_class AutoHotkeyGUI
    Exit
IfWinActive %source_title% ahk_class AutoHotkeyGUI
{
    Gui 2:Submit, NoHide
    old_text:="", undo_text:=text
    text:=RegExReplace(text,"^\R+")
    If !sep
        text:=RegExReplace(text,"\R?### .+? ###\R","")    
    ControlSetText Edit1,% text, ahk_class AutoHotkeyGUI
    ControlFocus Edit1
    ControlSend Edit1, ^{vk41}
    FileDelete ocr.*
}
else
{
    WinGetActiveTitle source_title
    WinGet, source_id, ID, A
}
gosub GetTag
If tag contains $time
{
    Gui 3:Destroy
    Gui 3:+AlwaysOnTop
    Gui 3:Margin , 5, 5
    Gui 3:font, s12
    Gui 3:Add, Text, , используя курсорные клавиши и календарь (Alt+Down)
    Gui 3:Add, DateTime ,wp+0 vDateTime, yyyy MMMM dd, dddd HH:mm
    Gui 3:Add, Button, y5 r2 w60 Default, OK
    Gui 3:Show, Center, Введите дату и время
    return
}
Last_add:
If A_ThisHotkey contains >^>+
{
    KeyWait RCtrl, T1.5
    SendEvent ^{F12}
    WinWaitNotActive % "ahk_id " source_id, , 5
    WinWaitActive ahk_class Cinta.ModelessDialog, , 10
}
If A_ThisHotkey contains >^
{
    Control Choose, % tab, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
    end:=""
    If ctrl_delay
        end:=ctrl_tag        
    ControlSetText Cinta.Edit2, % tag . end " "    
    If A_ThisHotkey not contains +
        return
}
else
{
    SendMessage, 0x147, 0, 0, Cinta.Combobox1
    stab:=ErrorLevel+1
    If (stab<>tab)
    {
        MsgBox, 262160, Ошибка, Тэг относится к другой секции!, 1.5
        return
    }
    ControlGetText old_tag, Cinta.Edit2
    s:=SubStr(old_tag,0)
    If (s=" ")
        StringTrimRight old_tag, old_tag, 1
    ControlSetText Cinta.Edit2, % old_tag " " tag " "
    Send {End}
    return
}
If start_tag contains $file
{
    ControlSetText Cinta.Edit1, % "File: " f_path
    ControlSetText Cinta.RichEdit1
}
If start_tag contains $site
{
    ControlSetText Cinta.Edit3, % site_add
    ControlSetText Cinta.RichEdit1, % site_text
}
ControlGetText add, Cinta.Edit3, ahk_class Cinta.ModelessDialog
If add && link2rem
    ControlSetText Cinta.RichEdit2, % add
If ! add && f_path
{
    If link2rem
        ControlSetText Cinta.RichEdit2, % f_path
    If dir_path
        SplitPath f_path, , f_path
    ControlSetText Cinta.Edit3, % f_path
}
ControlGetText n_txt, Cinta.RichEdit1
n_txt:=RegExReplace(n_txt,"^\R+","")
If end_note
    n_txt:=RegExReplace(n_txt,"s)(" end_note ").+$","")
n_txt:=MaxEmptyString(n_txt,max_empty_str)
ControlSetText Cinta.RichEdit1, % n_txt
If start_tag contains $dict
{
    RegExMatch(n_txt,"^.+?(?=(\R| - |\s{3,}|\||;|\{|\(|\[))",term)
    term:=RegExReplace(term,"^\s+(?=\w)","")
    ControlSetText Cinta.Edit1,% term
    StringLeft term, term, 1
    StringUpper term, term
    StringReplace tag, tag, $dict, % term
    ControlSetText Cinta.Edit2, % tag
}    
If (clip>0 && n_txt<>"")
{
    If (clip=2)
    {
        Loop parse, n_txt, `n, `r
        {
            If (A_LoopField="")
                continue
            n_txt:=A_LoopField            
            break            
        }
        n_txt:=ValidName(n_txt)
    }
    Clipboard:=n_txt
}
else
    Clipboard:=clip_old
Last_tag:
Gui 2:Submit
Loop
{
    
    SendMessage, 0x147, 0, 0, Cinta.Combobox1, ahk_class Cinta.ModelessDialog
    tab:=ErrorLevel+1
    ControlGetText tag, Cinta.Edit2
    sl:=SubStr(tag,0)
    If (sl=" ")
        StringTrimRight tag, tag, 1
    Sleep 100
    If (zt && n_txt && A_Index=10)
        Send ^{Enter}
    IfWinNotActive ahk_class Cinta.ModelessDialog
        break
}
return

;--------------------------
3ButtonOK:
Gui 3: Submit
FormatTime DateTime, % DateTime, % t_tree . "/HH:mm"
StringReplace tag, tag, $time, % DateTime
WinActivate % source_title
goto Last_add

3GuiClose:
3GuiEscape:
Gui 3: Cancel
return

Open:
gosub GetTag
FormatTime DateTime, , % t_tree
StringReplace tag, tag, $time, % DateTime
StringReplace tag, tag, /$dict
StringReplace tag, tag, $dict
Last_open:
KeyWait Alt, T1
KeyWait RCtrl, T1
KeyWait Space, T1
IfWinNotActive ahk_class CintaNotes.MainFrame
{
    SendEvent ^!{F12}
    WinWait ahk_class CintaNotes.MainFrame, , 3
    If ErrorLevel
        return
}
Send ^{%tab%}
Sleep 600
If tag
{
    ControlSetText Cinta.Edit1, % tag
    ControlSend Cinta.Edit1, {Enter}
    Sleep 200
    Send {Home}
}
KeyWait Alt, T1
If Errorlevel
    Send {Alt Up}
return

GetTag:
RegExMatch(A_ThisHotkey,"[^\^\+!>]+$",key)
tab:=tab_%key%
tag:=tag_%key%
f_path:="", start_tag:=tag, zt:=""

If tag contains $cmd,$cmt
{
    f_path:=GetPath("ahk_id " source_id)
    If !f_path
    {
        If tag contains $cmt
            goto Title
        MsgBox, 262160, Ошибка, Путь файла недоступен!, 1.5
        Exit
    }
    SplitPath f_path, , , , $cmd
    $cmd:=ValidName($cmd,"_")    
    StringReplace tag, tag, $cmd, % $cmd
    StringReplace tag, tag, $cmt, % $cmd
}

Title:
If tag contains $title,$cmt
{
    $title:=ValidName(CleanTitle(source_title),"_")
    StringReplace tag, tag, $title, % $title
    StringReplace tag, tag, $cmt, % $title
}

WinGet $proc, ProcessName, % "ahk_id " source_id
SplitPath $proc, , , , $proc
StringUpper $proc, $proc, T
StringReplace tag, tag, $proc, % ValidName($proc,"_")

If tag contains $file
{
    Clipboard:=""
    Send ^{vk43}
    ClipWait 2
    f_path:=Clipboard
    path_exist:=RegExMatch(f_path,"i)[a-z]:\\.+?\.[a-z0-9]{2,4}")
    If !path_exist
    {
        MsgBox, 262160, Ошибка, Путь недоступен!, 1.5
        Exit
    }
    SplitPath f_path, $file
    StringReplace tag, tag, $file, % ValidName($file,"_")
}

If tag contains $site
{
    If A_Thishotkey contains >^
    {
        Clipboard:=""
        Send ^{Ins}
        ClipWait 2
        site_text:=Clipboard
        Sleep 300
    }        
    Clipboard:=""
    Send ^{vk4C}
    Sleep 500
    Send ^{Ins}
    ClipWait 2
    site_add:=Clipboard
    RegExMatch(site_add,"(?<=//).+?(?=/)",$site)
    If !$site
    {
        MsgBox, 262160, Ошибка, Адрес недоступен!, 1.5
        Exit
    }
    StringReplace tag, tag, $site, % $site
}

If tag contains $z
{
    StringReplace tag, tag, $z
    zt:=1
}
return

;-------------------------
FirstUppercase(t)
{
    StringLeft n, t, 1
    StringTrimLeft k, t, 1
    StringUpper n, n
    return n . k
}

CleanTitle(t,l="")
{
    global
    RegExMatch(t,"i)[a-z]:\\.+?\.[a-z0-9]{2,4}",f_path)
    title:=f_path
    If !title
        RegExMatch(t,"i)(?<=\[).+\.[a-z0-9]{2,4}(?=])",title)
    If !title
        RegExMatch(t,"i)^.+\.[a-z0-9]{2,4}(?= - )",title)
    If !title
        RegExMatch(t,"i)(?<= - ).+\.[a-z0-9]{2,4}$",title)
    SplitPath title, , , ,title
    If !title
        RegExMatch(t,"^.+(?= - )",title)
    If !title
        title:=t
    If l
    {
        ln:=StrLen(title)
        If (ln>l-3)
        {
            StringLeft title, title, % l
            StringGetPos pos, title,% " ", R
            If !Errorlevel
                StringLeft title, title, % pos
            title:=title "..."
        }
    }
    return title
}

GetPath(title)
{
    WinGet pr, ProcessName, % title
    Process, Exist, % pr
    pid := ErrorLevel
    for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    If (process.ProcessId = pid)
    cmdline := process.CommandLine
    If cmdline contains Explorer.exe
        cmdline:=""
    fp:=RegExMatch(cmdline,"i)[a-z]:\\.*\.[a-z0-9]{2,5}",f_path,6)
    return f_path
}

MaxEmptyString(text,max)
{    
    n:=""
    Loop % max+1
        n.="`r`n"
    text:=RegExReplace(text,"(?<=.)\R{" max+2 ",}(?=.)",n)
    return text
}

ValidName(n,r="")
{
    n:=RegExReplace(n,"(:|;|,|\*|\?|\\|/|<|>|"")"," ")
    n:=RegExReplace(n,"\s+"," ")
    StringReplace n, n, |, -, All
    If r
        StringReplace n, n, % " ", % r, All
    return Trim(n)
}

;--------- GDI+ ----------
CaptureScreen(aRect, sFile, nQuality, Cursor)
{
    pToken := Startup()
    pBitmap := BitmapFromScreen(aRect, Cursor)
    If    sFile = 0
        SetBitmapToClipboard(pBitmap)
    Else
        SaveBitmapToFile(pBitmap, sFile, nQuality)
    DllCall("gdiplus\GdipDisposeImage", UInt, pBitmap)
    Shutdown(pToken)
}

BitmapFromScreen(Screen=0, Raster="")
{
    if (Screen = 0)
    {
        Sysget, x, 76
        Sysget, y, 77    
        Sysget, w, 78
        Sysget, h, 79
    }
    else if (SubStr(Screen, 1, 5) = "hwnd:")
    {
        Screen := SubStr(Screen, 6)
        if !WinExist( "ahk_id " Screen)
            return -2
        WinGetPos,,, w, h, ahk_id %Screen%
        x := y := 0
        hhdc := GetDCEx(Screen, 3)
    }
    else if (Screen&1 != "")
    {
        Sysget, M, Monitor, %Screen%
        x := MLeft, y := MTop, w := MRight-MLeft, h := MBottom-MTop
    }
    else
    {
        StringSplit, S, Screen, |
        x := S1, y := S2, w := S3, h := S4
    }

    if (x = "") || (y = "") || (w = "") || (h = "")
        return -1

    chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc), obm := SelectObject(chdc, hbm), hhdc := hhdc ? hhdc : GetDC()
    BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster)
    ReleaseDC(hhdc)
    
    pBitmap := CreateBitmapFromHBITMAP(hbm)
    SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
    return pBitmap
}

CreateBitmapFromHBITMAP(hBitmap, Palette=0)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", Ptr, hBitmap, Ptr, Palette, A_PtrSize ? "UPtr*" : "uint*", pBitmap)
    return pBitmap
}

SaveBitmapToFile(pBitmap, sOutput, Quality=75)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    SplitPath, sOutput,,, Extension
    if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
        return -1
    Extension := "." Extension

    DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
    VarSetCapacity(ci, nSize)
    DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, Ptr, &ci)
    if !(nCount && nSize)
        return -2
    
    If (A_IsUnicode){
        StrGet_Name := "StrGet"
        Loop, %nCount%
        {
            sString := %StrGet_Name%(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
            if !InStr(sString, "*" Extension)
                continue
            
            pCodec := &ci+idx
            break
        }
    } else {
        Loop, %nCount%
        {
            Location := NumGet(ci, 76*(A_Index-1)+44)
            nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int", 0, "uint", 0, "uint", 0)
            VarSetCapacity(sString, nSize)
            DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "str", sString, "int", nSize, "uint", 0, "uint", 0)
            if !InStr(sString, "*" Extension)
                continue
            
            pCodec := &ci+76*(A_Index-1)
            break
        }
    }
    
    if !pCodec
        return -3

    if (Quality != 75)
    {
        Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
        if Extension in .JPG,.JPEG,.JPE,.JFIF
        {
            DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, "uint*", nSize)
            VarSetCapacity(EncoderParameters, nSize, 0)
            DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, "uint", nSize, Ptr, &EncoderParameters)
            Loop, % NumGet(EncoderParameters, "UInt") ;%
            {
                elem := (24+(A_PtrSize ? A_PtrSize : 4))*(A_Index-1) + 4 + (pad := A_PtrSize = 8 ? 4 : 0)
                if (NumGet(EncoderParameters, elem+16, "UInt") = 1) && (NumGet(EncoderParameters, elem+20, "UInt") = 6)
                {
                    p := elem+&EncoderParameters-pad-4
                    NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20, "UInt")), "UInt")
                    break
                }
            }
        }
    }

    if (!A_IsUnicode)
    {
        nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, 0, "int", 0)
        VarSetCapacity(wOutput, nSize*2)
        DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sOutput, "int", -1, Ptr, &wOutput, "int", nSize)
        VarSetCapacity(wOutput, -1)
        if !VarSetCapacity(wOutput)
            return -4
        E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &wOutput, Ptr, pCodec, "uint", p ? p : 0)
    }
    else
        E := DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &sOutput, Ptr, pCodec, "uint", p ? p : 0)
    return E ? -5 : 0
}

SetBitmapToClipboard(pBitmap)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    off1 := A_PtrSize = 8 ? 52 : 44, off2 := A_PtrSize = 8 ? 32 : 24
    hBitmap := CreateHBITMAPFromBitmap(pBitmap)
    DllCall("GetObject", Ptr, hBitmap, "int", VarSetCapacity(oi, A_PtrSize = 8 ? 104 : 84, 0), Ptr, &oi)
    hdib := DllCall("GlobalAlloc", "uint", 2, Ptr, 40+NumGet(oi, off1, "UInt"), Ptr)
    pdib := DllCall("GlobalLock", Ptr, hdib, Ptr)
    DllCall("RtlMoveMemory", Ptr, pdib, Ptr, &oi+off2, Ptr, 40)
    DllCall("RtlMoveMemory", Ptr, pdib+40, Ptr, NumGet(oi, off2 - (A_PtrSize ? A_PtrSize : 4), Ptr), Ptr, NumGet(oi, off1, "UInt"))
    DllCall("GlobalUnlock", Ptr, hdib)
    DllCall("DeleteObject", Ptr, hBitmap)
    DllCall("OpenClipboard", Ptr, 0)
    DllCall("EmptyClipboard")
    DllCall("SetClipboardData", "uint", 8, Ptr, hdib)
    DllCall("CloseClipboard")
}

BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="")
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    return DllCall("gdi32\BitBlt"
                    , Ptr, dDC
                    , "int", dx
                    , "int", dy
                    , "int", dw
                    , "int", dh
                    , Ptr, sDC
                    , "int", sx
                    , "int", sy
                    , "uint", Raster ? Raster : 0x00CC0020)
}

CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff)
{
    DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", A_PtrSize ? "UPtr" : "UInt", pBitmap, A_PtrSize ? "UPtr*" : "uint*", hbm, "int", Background)
    return hbm
}

CreateCompatibleDC(hdc=0)
{
return DllCall("CreateCompatibleDC", A_PtrSize ? "UPtr" : "UInt", hdc)
}

CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    hdc2 := hdc ? hdc : GetDC()
    VarSetCapacity(bi, 40, 0)
    
    NumPut(w, bi, 4, "uint")
    , NumPut(h, bi, 8, "uint")
    , NumPut(40, bi, 0, "uint")
    , NumPut(1, bi, 12, "ushort")
    , NumPut(0, bi, 16, "uInt")
    , NumPut(bpp, bi, 14, "ushort")
    
    hbm := DllCall("CreateDIBSection"
                    , Ptr, hdc2
                    , Ptr, &bi
                    , "uint", 0
                    , A_PtrSize ? "UPtr*" : "uint*", ppvBits
                    , Ptr, 0
                    , "uint", 0, Ptr)

    if !hdc
        ReleaseDC(hdc2)
    return hbm
}

DeleteDC(hdc)
{
return DllCall("DeleteDC", A_PtrSize ? "UPtr" : "UInt", hdc)
}

DeleteObject(hObject)
{
return DllCall("DeleteObject", A_PtrSize ? "UPtr" : "UInt", hObject)
}

GetDC(hwnd=0)
{
    return DllCall("GetDC", A_PtrSize ? "UPtr" : "UInt", hwnd)
}

GetDCEx(hwnd, flags=0, hrgnClip=0)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
return DllCall("GetDCEx", Ptr, hwnd, Ptr, hrgnClip, "int", flags)
}

ReleaseDC(hdc, hwnd=0)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    return DllCall("ReleaseDC", Ptr, hwnd, Ptr, hdc)
}

SelectObject(hdc, hgdiobj)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    return DllCall("SelectObject", Ptr, hdc, Ptr, hgdiobj)
}

Startup()
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    if !DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
        DllCall("LoadLibrary", "str", "gdiplus")
    VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
    DllCall("gdiplus\GdiplusStartup", A_PtrSize ? "UPtr*" : "uint*", pToken, Ptr, &si, Ptr, 0)
    return pToken
}

Shutdown(pToken)
{
    Ptr := A_PtrSize ? "UPtr" : "UInt"
    
    DllCall("gdiplus\GdiplusShutdown", Ptr, pToken)
    if hModule := DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
        DllCall("FreeLibrary", Ptr, hModule)
    return 0
}

Автор: jenter
Дата сообщения: 09.04.2015 11:15
yngvar

Цитата:
А ожидается поддержка подсветки кода в заметках?

Ожидается "когда-нибудь".
Голосуйте тут: http://roadmap.cintanotes.com/topic/3228-source-code-syntax-highlighting/

Romaxin65

Цитата:
И куда она пропала? Все теги по прежнему на своих местах -переключайся не хочу.  

Теги со счетчиком 0 же не показываются. Чтобы переключиться на такой тег, надо сначала перейти в All, а потом уже проскроллить к нужному тегу и щелкнуть по нему.


Цитата:
И что там увидем? Именно:  сколько заметок из отобранных имеет какой-то тег
Если не сложно  скриншот.

https://www.dropbox.com/s/nox5w8k20oohx96/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202015-04-09%2015.05.15.png?dl=0

В правом верхнем углу отображается, сколько из заметок с тегом "cintanotes" имеют также тег "review" (что, очевидно, равно количеству заметок с тегом "review", имеющих также тег "cintanotes").


Цитата:
Так и я про тоже: зачем отображать счетчик сколько всего заметок с таким тегом в базе, это на самом деле не очень важно.

Там, кстати, отображается не по "всего в базе", а "всего в выбранных секциях".


Цитата:
что этому препятствует?

вот это:

Цитата:

Цитата: выделение любого тега приведет к пересчету почти всех счетчиков, причем большая часть будут показывать 0.


А зачем их показывать: ноль он и есть ноль.
Автор: Romaxin65
Дата сообщения: 09.04.2015 12:37
jenter

Цитата:
Теги со счетчиком 0 же не показываются

Да нет же:все теги по прежнему отображаются а скрываются только нули, счетчики связанных показывают остаток на сите(то что в ленте).
[more=Скриншот] [/more]
Покритикуйте вариант: Все остается как сейчас: счетчики показывают кол-во заметок во всем разделе.
Нажимаем любой тег - счетчики у связанных (синих) тегов переключаются на подсчет в ленте, а у отвязанных продолжают показывать общераздельное кол-во.

Цитата:
В правом верхнем углу отображается, сколько из заметок с тегом "cintanotes" имеют также тег "review" (что, очевидно, равно количеству заметок с тегом "review", имеющих также тег "cintanotes").

Наглядность не очень: счетчики связанных тегов живут своей жизнью: не реагируют на изменение в ленте: лента стала уже другой, а счетчики за ней не пошли, и остались на месте.
Автор: ViCin
Дата сообщения: 09.04.2015 19:18

Цитата:
yngvar

Цитата:
А ожидается поддержка подсветки кода в заметках?

Ожидается "когда-нибудь".
Голосуйте тут: http://roadmap.cintanotes.com/topic/3228-source-code-syntax-highlighting/


Я как-то предлагал более простую(?) и более широко нацеленную штуку - автоподсветку пользовательских ключевых слов. Т.е. пользователю предоставляется файл, в который он сам по мере надобности добавляет ключевые слова. А программа выводит их в простейшем случае жирным. А лучше всего - в этом файле прописываются секции. Допустим, "красный", "зеленый", "серый"...
Я вот не знаю проги, которая так может, а очень удобно и полезно. Тогда уж подсветка кода - частный случай. И несложно добавить ключевые слова конкретного языка программирования, взяв откуда-нибудь список.


Автор: rsuan
Дата сообщения: 11.04.2015 08:22
Проблема. В длинной ленте заметок, выбранных фильтром, фокусирую на одной из заметок например в середине ленты. Переключаюсь на другие окна, через некоторое время возвращаюсь в окно Cinta, - лента в начале и сфокусирована уже первая в ленте заметка. Это очень мешает, когда работаешь с заметками, приходится среди множества на ленте вновь искать нужную.
Возможно это происходит после синхронизации с сервером.

Добавлено:
Ещё некритическое замечание по программе. Если окно заметки близко к правой границе экрана (рабочего стола), то при наборе тегов возникающее окошко выбора из существующих тегов располагается так, чтобы не выходить за край экрана. Это правильно, но видимо забыли учесть случай когда панель задач Windows находится справа - данное окошко заходит за неё, и часть окошка не видно.
Автор: rsuan
Дата сообщения: 11.04.2015 18:23
Прошу в шапке опубликовать порядок продления лицензии.
Автор: jenter
Дата сообщения: 13.04.2015 10:21
Romaxin65

Цитата:
Да нет же:все  теги по прежнему отображаются а скрываются только нули, счетчики связанных показывают остаток на сите(то что в ленте).
Скриншот
Покритикуйте вариант: Все остается как сейчас: счетчики показывают кол-во заметок во всем разделе.
Нажимаем любой тег - счетчики у связанных (синих) тегов переключаются на подсчет в ленте, а у отвязанных продолжают показывать общераздельное кол-во.

Ага, значит я неправильно понял. Но Ваш вариант мне не нравится тем, что пользователю с первого взгляда будет не так просто сказать, что же в текущий момент показывает счетчик. Это так наз. "скрытый режим", которых специалисты по юзабилити рекомендуют избегать. Представьте себе, что обучаете новичка: "так, вот смотри, когда выделен тег "Все", счетчики показывают количество заметок во всем разделе, даже когда у нас лента отфильтрована поиском. Но стоит только нажать на какой-нибудь тег, счетчики будут показывать сколько заметок с таким тегом остались видимы в ленте". Меня бы это запутало.


Цитата:
Наглядность не очень: счетчики связанных тегов живут своей жизнью: не реагируют на изменение в ленте: лента стала уже другой, а счетчики за ней не пошли, и остались на месте.

Возможно. Предлагайте еще варианты, без скрытых режимов.

ViCin

Цитата:
Я как-то предлагал более простую(?) и более широко нацеленную штуку - автоподсветку пользовательских ключевых слов. Т.е. пользователю предоставляется файл, в который он сам по мере надобности добавляет ключевые слова. А программа выводит их в простейшем случае жирным. А лучше всего - в этом файле прописываются секции. Допустим, "красный", "зеленый", "серый"...
Я вот не знаю проги, которая так может, а очень удобно и полезно. Тогда уж подсветка кода - частный случай. И несложно добавить ключевые слова конкретного языка программирования, взяв откуда-нибудь список.


Ну да, такая простая подсветка слов по словарю - это гораздо проще и реалистичнее, чем полномасштабная подсветка кода. Только пользы от нее мало, например будет подсвечивать ключевые слова, находящиеся внутри строковых литералов, и т.д.

rsuan

Цитата:
Проблема. В длинной ленте заметок, выбранных фильтром, фокусирую на одной из заметок например в середине ленты. Переключаюсь на другие окна, через некоторое время возвращаюсь в окно Cinta, - лента в начале и сфокусирована уже первая в ленте заметка. Это очень мешает, когда работаешь с заметками, приходится среди множества на ленте вновь искать нужную.
Возможно это происходит после синхронизации с сервером.


Да, скорее всего это из-за синхрнизации. У вас последняя версия, 2.8.5?


Цитата:
Ещё некритическое замечание по программе. Если окно заметки близко к правой границе экрана (рабочего стола), то при наборе тегов возникающее окошко выбора из существующих тегов располагается так, чтобы не выходить за край экрана. Это правильно, но видимо забыли учесть случай когда панель задач Windows находится справа - данное окошко заходит за неё, и часть окошка не видно.


В самом деле. Но в новых windows эта панель по умолчанию полупрозрачная и такое поведение не вызывает особых осложнений. Но все равно поставил в очередь (с низким приоритетом).
Спасибо.

rsuan

Цитата:
Прошу в шапке опубликовать порядок продления лицензии.

А что именно вызывает вопросы?
Автор: ViCin
Дата сообщения: 13.04.2015 11:03

Цитата:
Ну да, такая простая подсветка слов по словарю - это гораздо проще и реалистичнее, чем полномасштабная подсветка кода. Только пользы от нее мало, например будет подсвечивать ключевые слова, находящиеся внутри строковых литералов, и т.д.

С другой стороны, вряд ли кто-то станет использовать Синту в качестве редактора программного кода, а вот кусочки полезные, функции для копи-паста можно хранить, и с кое-какой подсветкой (пусть неполноценной) они будут смотреться симпатичнее. Но подсветка кода - это ладно, на то есть все-таки редакторы, среды и т.п. Интереснее как раз возможность пользователю подсвечивать любые тексты, как ему заблагорассудится. Ключевые слова в тексте, которые выделяются сами и всегда.

Простой пример: дневниковые записи, в которых выделяются важные имена или занятия. Очень повышает наглядность.
Автор: StanislawK
Дата сообщения: 13.04.2015 11:12
ViCin

Цитата:
Интереснее как раз возможность пользователю подсвечивать любые тексты, как ему заблагорассудится. Ключевые слова в тексте, которые выделяются сами и всегда.

Простой пример: дневниковые записи, в которых выделяются важные имена или занятия. Очень повышает наглядность.


Проголосую за. Хорошая фича.


Цитата:
rsuanпорядок продления лицензии.


Цитата:
jenterА что именно вызывает вопросы?

На пожизненную лицензию действует купон 50% скидки
Цитата:
ru-board
?
Автор: jenter
Дата сообщения: 13.04.2015 13:18
ViCin

Цитата:
С другой стороны, вряд ли кто-то станет использовать Синту в качестве редактора программного кода, а вот кусочки полезные, функции для копи-паста можно хранить, и с кое-какой подсветкой (пусть неполноценной) они будут смотреться симпатичнее. Но подсветка кода - это ладно, на то есть все-таки редакторы, среды и т.п. Интереснее как раз возможность пользователю подсвечивать любые тексты, как ему заблагорассудится. Ключевые слова в тексте, которые выделяются сами и всегда.  
 
Простой пример: дневниковые записи, в которых выделяются важные имена или занятия. Очень повышает наглядность.


Очень хорошая идея. Только не совсем понятно, на каком уровне должна применяться подсветка (т.к. как синта должна понимать, какую схему подсветки использовать для конкретной заметки?) По наличию определенного тега? А что если они конфликтуют (есть два тега с разной подсветкой)?

Все это нюансы, которые и составляют основную сложность.

Добавлено:
StanislawK

Цитата:
На пожизненную лицензию действует купон 50% скидки


Действует. Кстати, после релиза 2.9 скидка будет уменьшена с 50% до 25%, так что торопитесь.
Автор: StanislawK
Дата сообщения: 13.04.2015 13:23
jenter

Цитата:
Только не совсем понятно, на каком уровне должна применяться подсветка (т.к. как синта должна понимать, какую схему подсветки использовать для конкретной заметки?)


к тексту в <code></code> применять подсветку кода. к тексту вне - применять подсветку пользовательской схемы.
Автор: jenter
Дата сообщения: 13.04.2015 13:28
StanislawK

Цитата:
к тексту в <code></code> применять подсветку кода.  к тексту вне - применять подсветку пользовательской схемы.

Синта не поддерживает теги форматирования.
Автор: ViCin
Дата сообщения: 13.04.2015 14:40

Цитата:
не совсем понятно, на каком уровне должна применяться подсветка (т.к. как синта должна понимать, какую схему подсветки использовать для конкретной заметки?) По наличию определенного тега? А что если они конфликтуют (есть два тега с разной подсветкой)?


Честно говоря, не особенно понял о чем это. Имел в виду пока вот что:

Начальный вариант: ключевые слова в спецфайле; Синта выделяет их жирным по всем заметкам и всем блокнотам.

Вариант-продолжение: возможность создавать такие файлы отдельно для блокнотов, для которых это необходимо (локальные файлы перекрывают действие глобального).

Вариант-продолжение в другую сторону: файл содержит секции по цветам.

Мне как-то проще думать о том, что все это как раз больше полезно не для программистских применений (хотя их не исключает).

Конечно, есть тут нюансы: как выделять - только слово целиком в том же виде или в разных падежах тоже, но в принципе, настройку таких параметров в конфиге можно сделать.

Вообще же идея растет из писательских редакторов, которые до этого уже почти доросли (но не доросли). Есть там, допустим, возможность ставить в соответствие кускам текста ключевые слова (почти теги), которые как раз раскрашиваются по-разному: персонажи одним цветом, локации другим и т.п. А вот почему бы прямо в тексте не сделать такое автовыделение?
Автор: mxa
Дата сообщения: 13.04.2015 14:55
Подсветка шикарно помогла бы спискам дел, если бы могла их подсвечивать и выделять среди остального текста и множества заметок. Можно отмечать как сами списки дел, определенным цветом, так и приоритеты, или сроки выполнения.

Но, как бы от подсветки производительность не упала...
Автор: StanislawK
Дата сообщения: 13.04.2015 15:40
jenter

Цитата:
Действует. Кстати, после релиза 2.9 скидка будет уменьшена с 50% до 25%, так что торопитесь.

То есть, цена пожизненного продления не 1999р, а 999р ?



Цитата:
Синта не поддерживает теги форматирования.

в каком смысле?

Автор: rsuan
Дата сообщения: 13.04.2015 18:19
jenter

Цитата:
Да, скорее всего это из-за синхрнизации. У вас последняя версия, 2.8.5?

Да.

Цитата:
в новых windows эта панель по умолчанию полупрозрачная и такое поведение не вызывает особых осложнений.

Уже считаете полупрозрачность стандартом? Ну не знаю, пользователей XP ещё достаточно много. А я и на Win7 отключаю полупрозрачность.

Цитата:
А что именно вызывает вопросы?

Вот это и вызывает вопрос, каков порядок продления в отличие от покупки вновь. У человека, у которого истекает срок лицензии, встаёт этот вопрос. Разве не понятно? 1. по той же ли стоимости, что и покупка вновь. 2. есть ли привязка к старому идентификатору пользователя. Даже если продление это просто покупка новой с отсутствием преемственности старой, всё равно это должно быть указано.
Автор: jenter
Дата сообщения: 14.04.2015 13:59
ViCin

Цитата:
Честно говоря, не особенно понял о чем это.

Ну, списки подсвечиваемых слов должны быть разные для разного типа заметок, разве нет?
А под цветами заметок Вы понимаете цвета секций в смысле секций записной книги, или Вы имеете в виду какие-то свои секции?

mxa

Цитата:
Можно отмечать как сами списки дел, определенным цветом, так и приоритеты, или сроки выполнения.

Не совсем понимаю как Вы этого достигнете, имея лишь подсветку слов из предопределенного набора?

StanislawK

Цитата:
То есть, цена пожизненного продления не 1999р, а 999р ?  

Это цена со скидкой покупки пожизненного лицензии "с нуля". Цена со скидкой апгрейда на пожизненную - 699р. Но это только пока действует 50% скидка.

StanislawK

Цитата:
в каком смысле?


Ну в Синте нет явных, доступных пользователю тегов <code></code>. Можно только выделить кусок и назначить ему формат - как в Ворде.

При этом формата "Код" сейчас не существует, есть только "Моноширинный".




Добавлено:
rsuan

Цитата:
Да, скорее всего это из-за синхрнизации. У вас последняя версия, 2.8.5?  
Да.


А сброс происходит всегда по завершению сихнронизации, или только когда синхронизация произвела какие-то изменения?


Цитата:
Вот это и вызывает вопрос, каков порядок продления в отличие от покупки вновь. У человека, у которого истекает срок лицензии, встаёт этот вопрос. Разве не понятно?

У меня глаз замылен, так что это не всегда очевидно. Вы видели вот эту страницу?
http://cintanotes.com/ru/pricing-ru/
Конкретно см. внизу раздел "Обновления" и "Переход на пожизненную лицензию".


Цитата:
1. по той же ли стоимости, что и покупка вновь.

Нет, продление стоит в два раза меньше.


Цитата:
есть ли привязка к старому идентификатору пользователя.

Есть привязка к адресу электронной почты. По нему определяется, что у человека уже есть лицензия. В случае, когда доступ к почте утерян, продление возможно после сообщения нам старого ключа.
Автор: ViCin
Дата сообщения: 14.04.2015 15:03
jenter

Цитата:
Ну, списки подсвечиваемых слов должны быть разные для разного типа заметок, разве нет?

Если как дальнейшее развитие - может быть. Но началом может быть просто файл с глобальным списком.


Цитата:
А под цветами заметок Вы понимаете цвета секций в смысле секций записной книги, или Вы имеете в виду какие-то свои секции?

В смысле в файле подсветки ключевые слова разбиты на секции.

------------------
* green *
------------------
слово1
...
словоN

------------------
* red *
------------------
слово1
...
словоN

Вроде того. Опять же как развитие. В принципе, уже возможность выделять ключевые жирным - очень здорово. А цветом - уже красиво.


Автор: rsuan
Дата сообщения: 14.04.2015 19:55

Цитата:
Вы видели вот эту страницу? http://cintanotes.com/ru/pricing-ru/

Не видел. Думаю её и надо в шапку. Будет понятно куда идти за информацией о продлении. И слова о 50(25)% скидке от первоначальной стоимости были бы заманухой. Я например думал что продление по той же цене.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677

Предыдущая тема: Зарплата Камин 2 ....


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.