Продолжение спора (начало см на
http://downloadmaster.net/forum/viewtopic.php?t=8137 ):
___ Будущую структуру я представляю так, ведь переписывать DM "с нуля", всё равно когда-нибудь придётся (Может это и плохое объяснение, но может, вы поймёте):
[Общая блок-схема (упрощённая)]
Code: Select all
+--------------------------------------------------------------------+
| Скриптовый движок |
+----------------------+----------------------+----------------------+
| Perl | Basic | Java |
+----------------------+----------------------+----------------------+
^ ^ ^
------------------------------------------------
V
+----------------------+ +----------------------+ +----------------------+
| Плагины | <==> | Исполняемый | <==> | api.dll |
+----------------------+ | файл download.exe | +----------------------+
+----------------------+ | Яз. файлы для DM | +----------------------+
| Графическая оболочка | ===> | | <==> | Протоколы сетей |
+----------------------+ +----------------------+ +----------------------+
| main.dll | ^ +> | HTTP |
+----------------------+ V | +----------------------+
| adddl.dll | +----------------------+ +> | HTTPS |
+----------------------+ | Файлы конфигурации | | +----------------------+
| info.dll | +----------------------+ +> | FTP |
+----------------------+ | general.ini | | +----------------------+
| ftpexp.dll | +----------------------+ +> | TORRENT |
+----------------------+ | off.ini | | +----------------------+
| gdl.dll | +----------------------+ +> | MMS |
+----------------------+ | Лицензия для IDA | | +----------------------+
| config.dll | +----------------------+ +> | ED2K |
+----------------------+ | +----------------------+
| шкура | +----------------------+ +> | FTPS |
+----------------------+ | Интернет | <=+ +----------------------+
| Яз. файлы для IDA | +----------------------+ +> | Другие |
+----------------------+ +----------------------+
* Скриптовый движок - без комментариев;
* Плагины - без комментариев;
* Графическая оболочка - разделена на отдельные части и вынесена в отдельные DLL + шкура (skn-файл) + lng-файл (IDA).
Подробнее:
main.dll - главное окно;
adddl.dll - окно добавить закачку;
info.dll - информационное окно;
ftpexp.dll - фтп эксплорэр (со всеми потрохами);
gdl.dll - окно групповой закачки;
config.dll - окно настроек программы.
___ Подобное разделение избавит разработчиков от криков "Верните как было!!!", к тому же, при разрешении, в них в каждом по отдельности, можно самому поковыряться, и переделать интерфейс окна под себя. И осуществить возможность выбора одного из нескольких интерфейсов.
* api.dll - это естественно API, вынесенный отдельно и при разрешении разработчиков в нем так же можно дописать новые возможности.
___ Параллельно можно добавить возможность использования ещё нескольких файлов для расширения возможностей API, которые исполняемый файл т.ж должен будет "видеть" и уметь пользоваться. При этом естественно между ними не должно быть конфликтных ситуаций и должна быть полная совместимость, что может быть сложно достижимо, с увеличением количества таких файлов, поэтому данная возможность весьма сомнительна, но можно это сделать на страх и риск пользователя.
* Протоколы сетей - на каждый протокол - свой файл (набор файлов), для его поддержания. У подобной системы должен быть ОДИН язык общения между протоколом и исполняемым файлом.
Файлы конфигурации - для (естественно) сохранения настроек DM и совместимости с режимом "Portable":
general.ini - для сохранения всего, что сейчас хранится в реестре, кроме данных о регистрации и даты установки (для IDA);
off.ini - предназначен для временного или постоянного отключения некоторых "не нужных" элементов оформления. (Специально для тех, кто "спит и видит" DM так, как было в версии 0.0.1
(выберите сами);
Лицензия для IDA - как файл, для совместимости с режимом "Portable";
download.exe - его единственная функция "скрутить" всё вместе и показать пользователю в удобном для него виде, с помощью графической оболочки. Других инструкций, кроме инструкций по управлению закачкой с помощью необходимого для этого протокола, он не имеет. При этом он должен видеть любой файл, который был вновь добавлен, будь то новый протокол, или скрипт, или дополнительный файл конфигурации API. Всё необходимое для этого он должен "брать" из этих файлов.
___ Для ускорения определения, при необходимости, какой-либо команды, которую необходимо передать для управления закачкой, нужно чтобы исполняемый файл делал это, на основе переданных ему данных из соответствующего протокола, которому принадлежит закачка.
___ Т.е для исполняемого файла должна создаваться иллюзия, что существует всего "один" протокол, но в зависимости от того какую закачку подсветил пользователь, исполняемый файл должен предоставить в графическом виде (элементы графического представления, как я уже говорил должны находиться отдельно, в данном случае в main.dll) свой набор данных для каждой закачки в соответствии с используемым для неё протоколом и пользовательскими настройками.
Описание главного окна (таблицы закачки) нового интерфейса:
Для объединения всего этого в кучу, в единый пользовательский интерфейс я предлагаю усовершенствовать только таблицу с закачками. Она должна выглядеть так:
Таблица для закачки, используя протокол № 1, под ней, через одну пустую строку, таблица для закачки, используя протокол № 2 и т.д пока есть протоколы. Получается некий лист на котором отображено последовательно несколько таблиц для каждого отдельного протокола, со своим набором колонок, которые пользователь может настроить, причём каждую в отдельности и по своему вкусу и желанию. При отсутствии закачек на каком-либо протоколе таблица для него должна скрываться и пользователь, соответственно, её видеть не должен, а если ему нужно настроить отображение колонок для данного протокола, то он включает принудительное отображение соответствующей таблицы и делает с ней всё, что хочет. Т.к у каждого протокола может быть (и есть) специфические свойства, то специально для них должна отображаться панелька сверху или снизу общей таблицы (по выбору пользователя), в которой будут представлены кнопки или может быть даже командная строка для их использования, данная панелька должна отображаться только если подсвечена закачка по её протоколу, так же каждая панелька должна иметь возможность постоянного отображения и быть перетаскиваемой в пределах указанной области (как в окнах проводника всех виндов до WinXP). При этом для управления закачкой любого протокола, её необходимо выбрать (подсветить) и нажать соответствующую для необходимого действия кнопку на общей панели инструментов, для всех протоколов закачек (будем считать ею имеющуюся панель инструментов) или клавиатурную комбинацию. Соответственно должен происходить автовыбор команды для данного действия для каждого протокола, в соответствии с тем, что подсвечено, а при подсветке закачек из нескольких или всех категорий - поочерёдная отправка соответствующих для данного действия команд для каждого из протоколов. Кроме всего этого для ячеек таблицы, в которой размер записи слишком велик, а растягивать данный столбец является не желательным (например, список фильтров IP), можно снизу данной таблицы добавить дополнительную "статусную" панель, которая будет отображать на всю свою ширину (которая равна всей ширине таблицы) значение отдельной ячейки, по которой пользователь произвёл щелчок держа например, CTRL + ALT. Можно осуществить отображение нескольких таких панелей как для одного протокола, так и для нескольких, фиксируя или закрывая их. Для этого можно осуществить 4 кнопки в конце панели - "-", "+", "<изображение_канцелярской_кнопки>" и "x", что означает "убрать 1-у панель", "добавить 1-у панель", "зафиксировать панель", и "закрыть панель" соответственно. Не зафиксированные панели после щелчка в любом месте - закрываются. Если содержимое не помещается и в этом случае, то в данном случае содержимое должно отображаться в режиме бегущей строки.
Как можно заметить здесь нет ни одного дублирующегося элемента интерфейса для каждого из протоколов - "всё в одном". Таблица закачек позволяет видеть все закачки одновременно по всем протоколам, вследствие чего ненужно переключаться между огромным числом вкладок (для меня в данном случае оно начинается с двух) для наблюдения за закачками каждого протокола.
* Таблица для существующих сегодня протоколов по-умолчанию должна отображаться всегда;
* Выбор "панельки" для отображения содержания отдельной ячейки в ней должен производиться так: или в той, которой щёлкнул мышкой пользователь, или циклически (по выбору пользователя в опциях).
* При подобной реализации таблицы закачек, при прокрутке списка закачек, возникает эффект отсутствия заголовка таблицы и эффект двойного заголовка, поэтому для исправления этого недостатка необходимо осуществить проверку двух верхних строк на наличие заголовка таблиц разных протоколов и принадлежность первой и второй строки общей таблицы к одному протоколу, т.е к закачкам по одному протоколу.
___ Для избежания подобных эффектов делаем следующие действия: заголовок в самой верхней строке должен быть всегда, для этого верхнюю строку таблицы (первая строка общей таблицы) делаем не прокручиваемой и отображаем в ней тот заголовок, той таблицы, строка которой отображается во второй строке общей таблицы, эту проверку думаю надо осуществлять только при наведении указателя и нажатии (и удержании) левой кнопки мыши на области, принадлежащей к прокрутке по вертикале данной общей таблицы закачек, а так же при обнаружении команды от колёсика мышки, причём не чаще 20 раз в сек. - думаю этого достаточно, далее проверяем наличие заголовка следующей таблицы (первая строка таблицы какого-либо протокола) во второй строке общей таблицы и при его обнаружении надо дать команду автоматической прокрутки вниз на одну строку, т.е поднять таблицу на одну строку, при этом её заголовок поднимется вверх, заменив заголовок предыдущей таблицы.
___ Чтобы избежать эффекта невозможности прокрутки таблицы вверх, необходимо осуществлять восстановление заголовка только ч.з 0,8 - 1,2 сек. (подбор опытным путём) и только в том случае если пользователь не удерживает указатель мыши в области прокрутки по вертикале данной общей таблицы закачек или кнопок "Вверх" и "Вниз" на клавиатуре. После восстановления заголовка, при прокрутке вверх на 1-у строку, появляется эффект двух заголовков для одной и той же таблицы (2 одинаковых), хоть это и восстановится ч.з выше указанные 0,8 - 1,2 сек. но это не красиво, чтобы избежать этого необходимо в течение этих 0,8 - 1,2 сек. отображать заголовок той таблицы, последняя строка которой находится в первой строке общей таблицы, т.е выше расположенной таблицы, принадлежащей др. протоколу. Всё, проблема решена!
* На "панельке" для избежания путаницы СЛЕВА должен отображаться номер закачки попорядку (имя слишком длинно - остаётся мало места) и сокращённое название ячейки - всё жирным шрифтом. Кроме этого необходимо добавить режим, при котором в одной ячейке таблицы разрешалось бы отображение нескольких строк её содержимого, т.е происходил перенос непоместившейся части содержимого в следующую подстроку (строку ячейки). Для этого можно добавить кнопку на панеле инструментов.
Всё это конечно не так-то просто осуществить, но я не требую это "к завтрашнему утру", просто мне таким видится оптимальный вариант DM будущего. Кто соображает лучше меня в программировании, пусть напишет, о возможности существования этой "системы", её достоинства и недостатки.