Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - Hush

Страницы: [1]
1
Доброго времени суток!  :)
Очень не хватает быстрой у удобной фильтрации сущностей - проектов\категорий\контактов. *bu*
Поэтому предлагаю расширить функционал текущего фильтра (вверху слева)

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

Получаем простой и быстрый способ найти любой проект\категорию\контакт!  *bp*
 *bi*Всех неравнодушных призываю голосовать за улучшение! *bi*

2
Набор параметров для фильтра сохраняется во время работы в историю и можно возвращаться к предыдущим фильтрам (на панели "Задачи" кнопки влево и вправо, они же Ctrl+Atl+B, Ctlr+Alt+F).
Очень хотелось бы иметь возможность переключаться по фильтрам с помощью кнопок "вперёд", "назад" на мыше.

3
Наконец-то нашёл время написать своё видение модернизации плагинного API. (user)
Причины, по которым, как мне кажется, такая модернизация нужна:
1. Плохая структурированность существующего API. Не ориентированность его на расширение. Чем больше выносится в API, тем труднее в нём оринтироваться.
2. Конгломератность самого LT. Многие части LT у пользователей вызывают сомнение, например многие не пользуются почтой, кто-то не видит смысла в категориях и использует только проекты. Чем на мой взляд хорош LT, так это тем, что в отличие от других органайзеров не навязывает свою ТМ парадигму. Если бы почта и категории были реализованы в виде плагинов, то это было бы огромным плюсом. Конечно можно сказать что категории сильно завязаны с ядром LT, и не могут существовать как плагин. Это верно, но грамотно построенным плагинным API и методичным рефакторингом категории или почту можно действительно вынести в плагины без ущерба целостной функциональности.
3. Неорганизованность самих плагинов. Каждый плагин работает независимо, не зная о существовании остальных.
4. Низкий уровень интеграции плагинов в архитектуру LT. Плагины не выглядят частью системы, например нереально внедрить свою панель в навигатор.
Предлагаемое решение:
С такой проблемой отлично справляется мессенжер Miranda IM и я предлагаю воспользоваться их опытом и архитектурой.
Идея очень простая и смысл описывается на 3 страницах. Скачать описание можно тут
Опишу решение вкратце:
1. Есть некое ядро Core. Оно минималистично и главным образом организует правильную работу зарегистрированных плагинов.
2. Каждый модуль (плагин) реализует в себе один или несколько компонентов.
3. Каждый компонент может уведомлять об определённых событиях. Любой компонент из любого модуля может поставить обработчик на возникновение этого события и обрабатывать его как ему нужно.
Именование "Module/Component/Hooks"
4. Каждый компонент может регистрировать определённые сервисы (ф-ии), которые он готов предоставлять всем желающим.
Именование "Module/Component/Service"
Теперь рассмотрим как это соотносится с LeaderTask:
1. Ядро -смысл такой же, организация работы модулей.
2. Модули: для LT логично реализовать внутренние модули:
  • Категории Categories
  • Проекты Projects
  • Контакты Contacts
  • Задачи Tasks
  • Фильтры Filters
  • Почта Mail
  • Навигатор Navigator
  • другие...
Для примера возьмём категории.
Для работы с данными Categories предоставляет определённые услуги для добавления, изменения, удаления категорий.
Для примера - добавление категории.
Categories регистрирует услугу AddCategory.
В соответствии с нотацией целиком это будет выглядеть как
Categories/Сategory/AddCategory
Для оповещения о добавлении категории Categories регистрирует событие OnAddCategory, и любой компонент может поставить обработчик на событие
Categories/Category/OnAddCategory
Для своей работы Categories использует услугу Навигатора для добавления собственной панели и ярлыка.
Т.е. навигатор предоставляет нечто вроде
Navigator/Navigator/AddPanel
Также Categories использует услугу Фильтра для добавления фильтрации по категориям.
Filters/Filter/AddFilter
Фильтрация должна идти по цепочке, т.е. последовательно применяя фильтры.
При реализованном в таком виде LT из него легко можно исключить даже такую базовую сущность как категорию. Т.к. в действительности это просто расширение навигатора, фильтра, настроек и т.д.
Так выглядел бы идеальный вариант. Т.к. в реальности придётся иметь дело с действующей архитектурой, то для упрощения можно воспользоваться следующим сценарием:
1. Реализовать ядро плагинной системы
2. Существующий функционал не рефакторить под плагинную систему, но модернизировать существующее API для использования хуков и услуг внутренних плагинов. Т.е. в действительности базовый функционал не будет модульным, но API его будет не отличим от модульного.
3. Требует значительного расширения сам API, например:
  • Добавление своей панели в навигатор
  • Добавление в принципе своей панели (плавающей и внедряемой)
  • Добавление своего поля в свойства задачи
  • Различные хуки для наведения на задачу в списке, в планере
  • Различные хуки и услуги для применения фильтров
Подводя итог, модернизация API позволила бы:
1. Иметь более чёткую модульную, расширяемую структуру. Ясный стандарт в API.
2. В случае полной поддержки такой модульности - выделить некоторые части в модули (например почту)
3. Использовать последовательное увеличение функциональности (модули используют модули, которые используют модули =))
4. Более высокий уровень интеграции плагинов при расширении API.
Расширению компонентного API я бы уделил отдельную тему, если предложенная модернизация API будет одобрена.

4
Что происходит сейчас:
1) Хочешь вставить ссылку в LT, копируешь либо путь к файлу, либо URL в буфер обмена.
2) Вставляешь ссылку - Ctrl+L
3) Выбираешь тип ссылки
4) Вводишь наименование

Как хотелось бы:
1) аналогично
2) аналогично
3) Вот тут хорошо бы реализовать анализатор содержимого буфера обмена.
Если текст начинается с "c:\","d:\", и т.д., то автоматом выбирать тип ссылки - файл (ссылка) или каталог (ссылка).
Если начинается с "http", "ftp", "https", то выбирать тип - ссылка URL
4) Если удалось определить тип ссылки, то фокус ввода сразу ставить в поле "наименование", и по умолчанию заполнять ссылкой


Также имеет смысл отлавлить нажатие Ctrl-V в списке задач, и если в буфере ссылка - то также открывать быстрое добавление ссылки (возможно даже не стоит открывать окно добавления, а вставлять ссылку с наименованием=ссылке)

5
Допустим выделяем задачу - появляется панель "Заметка". Затем кликаем мышью в свободную область в списке задач, чтобы снять выделение задачи. После этого панель "Заметка" становится неактивной, и над ней не видно курсора (точнее видно - курсор есть, но разглядеть его можно только с орлиным зрением). Сильно дезориентирует, просьба в таком случае либо прятать панель "Заметка", либо делать курсор стандартным указателем.

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

7
Уважаемые разработчики, предлагаю добавить API для уведомлений. Было бы очень удобно и добавило бы плагинам более интегрированный вид. Сейчас пригодилось бы для уведомления хронометража.
Параметры уведомления
  • Заголовок title
  • Пиктограмма уведомления icon (тип hBitmap например)
  • Текст уведомления text
  • Кнопки вида гиперссылок btns (кнопок несколько, передаются как одна строка с разделителями "первая||вторая||третья" например
  • Callback - функция, которую ЛТ вызывает, когда пользователь нажал на какую-то кнопку. В ф-ию передаётся текст кнопки, на которую нажали.
Результатом вызова должен быть некий uid уведомления, через который потом можно с ним еще работать через API, например закрыть через некоторое время, если пользователь не реагирует.

Сори за грубый набросок.

8
По-моему неправильно работает добавление записи в историю задачи.
ADDIN_LT_DLL LPCWSTR AddinLT_Task_AddHistoryRecord( LPCWSTR szUID,
DATE dtRecordDate,
BOOL bChangesCreated,
BOOL bChangesState,
BOOL bChangesDates,
BOOL bChangesCommentary,
LPCWSTR szTaskTitle,
UINT iTaskState,
DATE dtTaskDateBegin,
DATE dtTaskDateEnd,
LPCWSTR szCommentary ); // return new HistoryRecordUID or "" if error
Насколько понимаю - запись должна создаваться в зависимости от типа изменения - создание задачи\состояние\даты\комментарий.
Допустим мне надо сделать запись об изменнии состояния задачи, соответственно ставлю
bChangesCreated=false
bChangesState=true
bChangesDates=false
bChangesCommentary=false
Вместо одной  в историю добавляется 4 записи, как будто все флаги=true:
[28.11.2010, 23:40] Задача создана
[28.11.2010, 23:40] Поставлен статус: В работе
[28.11.2010, 23:40] Изменен срок: 27.11.2010
[28.11.2010, 23:40]

9
Type and run - программа, которая позволит быстро запускать любые программы. В linux привычная вещь, когда для запуска программы достаточно набрать её название в консоли. Type and run призвана помочь в этом под Windows. Достаточно составить свой список, и программа будет понимать что вы хотите открыть по одному названию. Очень удобно использовать, рекомендую.
+ можете навсегда забыть о заваленном ярлыками столе и о ковырянии в меню (что особенно неудобно, когда программ за сотню)
Здесь можно прочитать обзор других "лаунчеров", я для себя выбрал type and run за удобство и минималистичность.

11
В LeaderTask уже реализованы стандартные диалоги выбора
  • проектов
  • категорий
  • контактов
  • периода
Предлагаю вынести эти диалоги в API.
Т.е. я вызываю ф-ию выбора проектов - открывается стандартный диалог LT. Затем возвращается
  • указатель на массив UID, если пользователь выбрал проекты
  • null, если юзер ничего не выбрал
Аналогично категории и контакты.
Для выбора периода передаю 2 указателя - куда записать даты "от" и "до".
Для каждого диалога должен передаваться указатель на структуру, описывающую дополнительные параметры диалога(допустим заголовок диалога, фильтр и т.д. - на первое время ненужные рюшки, которые можно реализовать в последнюю очередь. Поскольку диалоги могут меняться, то обновить структуру будет проще, чем добавлять\удлать параметры в самой ф-ии.)
Возврат результатов диалога понятно по callback-функции.

12
Уважаемые разработчики, очень хотелось бы увидеть в скором времени следующее расширение LT Plugin API:(user)
1. Получение истории изменений статуса задачи  (таблица taskhistory)
1. Получение истории изменений статуса задачи  (таблица taskhistory)
ADDIN_LT_DLL int AddinLT_Task_GetHistoryLength( LPCWSTR szUID );//возвращает кол-во строк в истории
ADDIN_LT_DLL LPCWSTR AddinLT_Task_GetHistoryRecord( LPCWSTR szUID , int inHistory); возвращает recordUID строки истории
ADDIN_LT_DLL LPCWSTR AddinLT_Task_AddHistoryComment(LPCWSTR szUID , LPCWSTR szComment, DATE dt); //добавление комментария в историю, возращает UID записи
//работа со строкой истории
ADDIN_LT_DLL BOOL AddinLT_Record_isPresent(LPCWSTR szUID);
ADDIN_LT_DLL DATE AddinLT_Record_GetDate(LPCWSTR szUID);
ADDIN_LT_DLL BOOL AddinLT_Record_SetDate(LPCWSTR szUID, DATE dt);
ADDIN_LT_DLL LPCWSTR AddinLT_Record_GetTaskText(LPCWSTR szUID);
ADDIN_LT_DLL INT AddinLT_Record_GetTaskStatus(LPCWSTR szUID);
ADDIN_LT_DLL INT AddinLT_Record_SetTaskStatus(LPCWSTR szUID);

ADDIN_LT_DLL DATE AddinLT_Record_GetDateBegin( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Record_SetDateBegin( LPCWSTR szUID, DATE dt );
ADDIN_LT_DLL DATE AddinLT_Record_GetDateEnd( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Record_SetDateEnd( LPCWSTR szUID, DATE dt );

ADDIN_LT_DLL LPCWSTR AddinLT_Record_GetComment( LPCWSTR szUID);
ADDIN_LT_DLL BOOL AddinLT_Record_SetComment( LPCWSTR szUID, );
//операции
ADDIN_LT_DLL BOOL AddinLT_Record_SaveChanges( LPCWSTR szUID );
ADDIN_LT_DLL LPCWSTR AddinLT_Record_Insert( LPCWSTR szUID, // if szUID == "", return new UID
   LPCWSTR szTaskUID, //вся необходимая инфа проставляется по UID задачи
   DATE dtCreateDate );
ADDIN_LT_DLL BOOL AddinLT_Record_Delete( LPCWSTR szUID );


2. Работа с фильтрами
По аналогии с существующими ф-иями необходимы следующие:
ADDIN_LT_DLL BOOL AddinLT_Filter_IsPresent( LPCWSTR szUID );   
ADDIN_LT_DLL int AddinLT_Filter_GetChildsCount( LPCWSTR szUID );
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_GetChildUID( LPCWSTR szUID, int nChild );
//заголовок
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_GetTitle( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_SetTitle( LPCWSTR szUID, LPCWSTR szTitle );
//проекты
ADDIN_LT_DLL int AddinLT_Filter_GetProjectsCount( LPCWSTR szUID );
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_GetProjectsUID( LPCWSTR szUID, int nProject );
ADDIN_LT_DLL BOOL AddinLT_Filter_AddProject( LPCWSTR szUID, LPCWSTR szProjectUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_RemoveProject( LPCWSTR szUID, LPCWSTR szProjectUID );
//категории
ADDIN_LT_DLL int AddinLT_Filter_GetCategoriesCount( LPCWSTR szUID );
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_GetCategoryUID( LPCWSTR szUID, int nCategory );
ADDIN_LT_DLL BOOL AddinLT_Filter_AddCategory( LPCWSTR szUID, LPCWSTR szCategoryUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_RemoveCategory( LPCWSTR szUID, LPCWSTR szCategoryUID );
//контакты
ADDIN_LT_DLL int AddinLT_Filter_GetContactsCount( LPCWSTR szUID );
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_GetContactUID( LPCWSTR szUID, int nCiontact );
ADDIN_LT_DLL BOOL AddinLT_Filter_AddContact( LPCWSTR szUID, LPCWSTR szContactUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_RemoveContact( LPCWSTR szUID, LPCWSTR szContactUID );
//период
ADDIN_LT_DLL DATE AddinLT_Filter_GetDateBegin( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_SetDateBegin( LPCWSTR szUID, DATE dt );
ADDIN_LT_DLL DATE AddinLT_Filter_GetDateEnd( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_SetDateEnd( LPCWSTR szUID, DATE dt );
//приоритет
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_GetPriorityUID( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_SetPriorityUID( LPCWSTR szUID, LPCWSTR szPriorityUID );
//избранный
ADDIN_LT_DLL BOOL AddinLT_Filter_IsFavorite( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_SetFavorite( LPCWSTR szUID, BOOL bFavorite );
//порядок
ADDIN_LT_DLL UINT AddinLT_Filter_GetOrder( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_SetOrder( LPCWSTR szUID, UINT iOrder );
//операции
ADDIN_LT_DLL BOOL AddinLT_Filter_SaveChanges( LPCWSTR szUID );
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_Insert( LPCWSTR szUID, // if szUID == "", return new UID
    LPCWSTR szParentUID, // can be "root" or ""
    LPCTSTR szTitle,
   DATE dtCreateDate );
ADDIN_LT_DLL BOOL AddinLT_Filter_Delete( LPCWSTR szUID );
//текущий фильтр
ADDIN_LT_DLL LPCWSTR AddinLT_Filter_GetCurrent();
ADDIN_LT_DLL BOOL AddinLT_Filter_SetCurrent(LPCWSTR szUID);//если '' то очистить фильтр

Если доработаете фильтр по статусу задачи, то еще ф-ии
//статус
ADDIN_LT_DLL int AddinLT_Filter_GetTaskState( LPCWSTR szUID );
ADDIN_LT_DLL BOOL AddinLT_Filter_SetTaskState( LPCWSTR szUID, int iState );



Реализации пункта 1 жду с нетерпением для разработки плагина хронометража.

P.S.: Предлагаю создать подраздел форума "Плагины\Обсуждение API" для подобных тем, и эту тему перенести туда же.


13
Плагин импорта ICQ контактов
Назначение: перенос контакт-листа ICQ в контакты LeaderTask.
Форматы данных:
  • ".clb" - стандартный файл контакт-листа ICQ. Из файла clb тянутся только 3 параметра для каждого контакта:
    • группа
    • ICQ номер(прописывается в средствах связи в LT)
    • заголовок контакта
  • ".xml" - файл экспорта контактов клиента Miranda IM. Из файла xml тянутся для каждого контакта:
    • группа
    • ICQ номер
    • фамилия
    • имя
    • отчество
    • заголовок контакта
    • аватар
Использование:
1. Скопируйте файл ICQ_Import.ltdll в папку Plugins Leader Task
2. В LeaderTask выберите из меню Инструменты->импорт ICQ контактов
3. В окне плагина нажмите кнопку "Открыть"
4. В окне выбора файла выберите нужный формат данных (поле тип файла внизу диалога выбора файла)
5. Выберите файл с контактами
6. По желанию установите опции
  • Экспортировать аватары - если вы используете xml файла контактов Miranda IM
  • Создавать контакт-родитель для группы
7. Перед импортом контактов их можно отредактировать - щелкните по контакту из списка, отредактируйте поля справа и нажмите кнопку "Запомнить"
8. Выберите интересующий контакт (для выбора нескольких контактов используйте Shift)
9. Нажмите кнопку "Импортировать"
10. Если что-то не так, импортированные контакты можно откатить (кнопка "отменить")

Перед использованием рекомендуется сделать резервную копию базы LeaderTask

14
Да, я знаю, что масштаб можно поменять с помощью Ctrl+прокрутка, но это действие далеко не очевидно для того, кто видит LT первый раз. Помню когда только знакомился с LT (а перепробовал я немало до него), то сначала было расстроился, что масштаб не меняется, и только интереса ради попытался Ctrl+прокрутка. Вобщем действие неочевидное, а расстроить и даже оттолкнуть от использования LT при первом впечатлении вполне может. Поэтому предлагаю сделать ползунок, управляющий масштабом отображения
Голосуем! :)

Страницы: [1]