diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml index 5f05cc6..c90f6d3 100644 --- a/.github/workflows/Release.yaml +++ b/.github/workflows/Release.yaml @@ -16,7 +16,7 @@ jobs: # Константы, используемые далее по тексту env: PROJ: ${{ github.event.repository.name }} - TAG: '1.0' + TAG: '1.0.5' steps: # Проверка состава репозитория (без анализа, как может показаться) diff --git a/.release/GrammarMustJoy.apk b/.release/GrammarMustJoy.apk index bb4a890..ef89a12 100644 Binary files a/.release/GrammarMustJoy.apk and b/.release/GrammarMustJoy.apk differ diff --git a/.release/GrammarMustJoy.exe b/.release/GrammarMustJoy.exe new file mode 100644 index 0000000..9d0ceea Binary files /dev/null and b/.release/GrammarMustJoy.exe differ diff --git a/.release/GrammarMustJoy_ru_ru.html b/.release/GrammarMustJoy_ru_ru.html new file mode 100644 index 0000000..f42a4c5 --- /dev/null +++ b/.release/GrammarMustJoy_ru_ru.html @@ -0,0 +1,43 @@ + + +Проект Grammar must joy: общие сведения | GrammarMustJoy + + + + +

Проект Grammar must joy: общие сведения

+

ƒ  RD AAOW FDL; 6.07.2024; 0:02

+ +

Существует огромное количество групп и сообществ, коллекционирующих юмор во всех его формах. Но вряд ли многие +из них могут похвастаться грамотностью текстов и подписей. И речь не о случаях, когда именно её отсутствие есть +основа для шутки. Это может быть даже не их вина – при огромном количестве скриншотов вместо обычных постов +этого в принципе сложно добиться.

+

Что ж, попробуем это исправить. Долгое время мы собирали понравившиеся записи, преобразуя их в приятную глазу +форму и выкладывая на своей стене. Просто так, чтобы отвлечься от текучки. Теперь огромный, образовавшийся почти +за семь лет запас доступен на этом канале вместе с новыми отечественными и зарубежными текстами.

+

Казалось бы, зачем это нужно? И всё-таки результат того сто́ит. Контент от этих манипуляций становится только +лучше. Но при этом возвращаются возможность текстового поиска по знакомым словам и скорость загрузки на особо +медленных девайсах. К тому же, благодаря долгому отбору в коллекции остались лишь самые «стойкие» экспонаты.

+

Вещание сообщества уже давно ведётся в Telegram, используя менее удобную платформу ВК в качестве +зеркала. Контент тот же, но, благодаря возможностям мессенджера во многих записях исправлены старые ошибки +и огрехи форматирования.

+

Кроме того, мы создали приложение-клиент для этого сообщества. Его главная особенность – способность извлекать +записи в случайном порядке из всего архива сообщества, исключая повторения, а также быстро и просто ими делиться. +Оно исключает необходимость ручного пролистывания новостной ленты.

+

Итак, добро пожаловать в Grammar must joy!

+
+

Пара моментов:

+
    +
  1. Да, контент не всегда будет (читайте: почти никогда не будет) оригинальным. И если он вдруг окажется на пути +чьего-нибудь копирайта, мы просим извещать нас об этом. Такой контент нам... будет изыматься из ленты.
  2. +
  3. Записи могут быть разными. Конечно, без шока, браззерс и прочей неразрешёнки. Но всё-таки 18+!
  4. +
  5. Если мы всё же где-то допускаем ошибки (что вероятно), просим также нам об этом сообщать. При таком названии группы +не хочется ударять в грязь лицом.
  6. +
  7. Мы следуем Политике социальных сообществ. Поэтому рекламы в обозримом +будущем здесь не будет. Да и комментарии тут ни к чему. Но советы, пожелания и конструктивная критика приветствуются +(в комментариях головного сообщества).
  8. +
+

Очень надеемся, что Вам понравится юмор, который почти не подчёркивается Word’ом!

+ + + diff --git a/.release/Release.md b/.release/Release.md index 8abf292..7c9ae36 100644 --- a/.release/Release.md +++ b/.release/Release.md @@ -1,2 +1,4 @@ -_Changes for v 1.0_: -- Initial release as a stand-alone application +_Changes for v 1.0.5_: +- Добавлено отключение подписей текстов при копировании из приложения; +- Исправлены некорректные вызовы некоторых разделов справки и поддержки; +- Начальный релиз в качестве самостоятельного приложения diff --git a/Changes.log b/Changes.log index 99087e5..3be9872 100644 --- a/Changes.log +++ b/Changes.log @@ -1,5 +1,9 @@ Grammar must joy: changes log +Version 1.0.5: +• Добавлено отключение подписей текстов при копировании из приложения; +• Исправлены некорректные вызовы некоторых разделов справки и поддержки + Version 1.0: -• A stand-alone app (from uNot) has been made; -• Publication on GitHub +• Реализовано самостоятельное приложение на основе функционала uNot; +• Приложение опубликовано на GitHub diff --git a/src/GrammarMustJoyForm.cs b/src/GrammarMustJoyForm.cs new file mode 100644 index 0000000..b10a0ea --- /dev/null +++ b/src/GrammarMustJoyForm.cs @@ -0,0 +1,231 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace RD_AAOW + { + /// + /// Класс описывает главную форму приложения + /// + public partial class GrammarMustJoyForm: Form + { + // Переменные + private NotifyIcon ni = new NotifyIcon (); + private bool allowExit = false; + private bool hideWindow; + + /// + /// Конструктор. Настраивает главную форму приложения + /// + public GrammarMustJoyForm (bool HideWindow) + { + // Инициализация + InitializeComponent (); + + this.Text = ProgramDescription.AssemblyVisibleName; + this.CancelButton = BClose; + MainText.Font = new Font ("Calibri", 13); + if (!RDGenerics.AppHasAccessRights (false, false)) + this.Text += RDLocale.GetDefaultText (RDLDefaultTexts.Message_LimitedFunctionality); + hideWindow = HideWindow; + + // Принудительные параметры + if (!RDLocale.IsCurrentLanguageRuRu) + RDLocale.CurrentLanguage = RDLanguages.ru_ru; + + if (GMJ.EnablePostSubscription) + GMJ.EnablePostSubscription = false; + + /*ReloadNotificationsList (); + if TGT + GetGMJ.Visible = false; + else + GetGMJ.Visible = RDLocale.IsCurrentLanguageRuRu; + endif*/ + + // Получение настроек + RDGenerics.LoadWindowDimensions (this); + ReadMode.Checked = RDGenerics.GetSettings (readPar, false); + /*callWindowOnUrgents = RDGenerics.GetSettings (callWindowOnUrgentsPar, false); + */ + try + { + FontSizeField.Value = RDGenerics.GetSettings (fontSizePar, 130) / 10.0m; + } + catch { } + + // Настройка иконки в трее + ni.Icon = Properties.GrammarMustJoy.GMJNotifier16; + ni.Text = ProgramDescription.AssemblyVisibleName; + ni.Visible = true; + + ni.ContextMenu = new ContextMenu (); + + /*ni.ContextMenu.MenuItems.Add (new MenuItem (RDLocale.GetText ("MainMenuOption02"), ShowSettings)); + ni.ContextMenu.MenuItems[0].Enabled = RDGenerics.AppHasAccessRights (false, true);*/ + + ni.ContextMenu.MenuItems.Add (new MenuItem ( + RDLocale.GetDefaultText (RDLDefaultTexts.Control_AppAbout), AboutService)); + ni.ContextMenu.MenuItems.Add (new MenuItem ( + RDLocale.GetDefaultText (RDLDefaultTexts.Button_Exit), CloseService)); + + ni.MouseDown += ShowHideFullText; + ni.ContextMenu.MenuItems[1].DefaultItem = true; + } + + private void GrammarMustJoyForm_Shown (object sender, EventArgs e) + { + // Скрытие окна настроек + GrammarMustJoyForm_Resize (null, null); + if (hideWindow) + this.Hide (); + + /*// Запуск + MainTimer.Interval = (int)ProgramDescription.MasterFrameLength * 4; + MainTimer.Enabled = true;*/ + } + + // Завершение работы службы + private void CloseService (object sender, EventArgs e) + { + allowExit = true; + this.Close (); + } + + private void GrammarMustJoyForm_FormClosing (object sender, FormClosingEventArgs e) + { + // Остановка службы + if (allowExit) + { + // Остановка + ni.Visible = false; + /*MainTimer.Enabled = false; + + // Освобождение ресурсов + ns.Dispose ();*/ + } + + // Скрытие окна просмотра + else + { + this.Hide (); + e.Cancel = true; + } + } + + // О приложении + private void AboutService (object sender, EventArgs e) + { + RDGenerics.ShowAbout (false); + } + + // Отображение / скрытие полного списка оповещений + private void ShowHideFullText (object sender, MouseEventArgs e) + { + // Работа только с левой кнопкой мыши + if (e.Button != MouseButtons.Left) + return; + + /*// Отмена состояния сообщений + ns.HasUrgentNotifications = false;*/ + + // Обработка состояния + if (this.Visible) + { + this.Close (); + } + else + { + this.Show (); + this.TopMost = true; + this.TopMost = false; + MainText.ScrollToCaret (); + } + } + + // Закрытие окна просмотра + private void BClose_Click (object sender, EventArgs e) + { + /*// Отмена состояния сообщений + ns.HasUrgentNotifications = false;*/ + + this.Close (); + } + + // Переход в режим чтения и обратно + private void ReadMode_CheckedChanged (object sender, EventArgs e) + { + // Изменение состояния + if (ReadMode.Checked) + { + MainText.ForeColor = RDGenerics.GetInterfaceColor (RDInterfaceColors.LightGrey); + MainText.BackColor = RDGenerics.GetInterfaceColor (RDInterfaceColors.DefaultText); + } + else + { + MainText.ForeColor = RDGenerics.GetInterfaceColor (RDInterfaceColors.DefaultText); + MainText.BackColor = RDGenerics.GetInterfaceColor (RDInterfaceColors.LightGrey); + } + + // Запоминание + RDGenerics.SetSettings (readPar, ReadMode.Checked); + } + private const string readPar = "Read"; + + // Изменение размера формы + private void GrammarMustJoyForm_Resize (object sender, EventArgs e) + { + MainText.Width = this.Width - 38; + MainText.Height = this.Height - 87; + + ButtonsPanel.Top = MainText.Top + MainText.Height - 1; + } + + // Сохранение размера формы + private void GrammarMustJoyForm_ResizeEnd (object sender, EventArgs e) + { + RDGenerics.SaveWindowDimensions (this); + } + + // Запрос сообщения от GMJ + private void GetGMJExecutor (object sender, DoWorkEventArgs e) + { + e.Result = GMJ.GetRandomGMJ (); + } + + private void GetGMJ_Click (object sender, EventArgs e) + { + // Запрос записи + RDGenerics.RunWork (GetGMJExecutor, null, "Запрос случайной записи...", + RDRunWorkFlags.CaptionInTheMiddle); + string s = RDGenerics.WorkResultAsString; + string item; + + if (s != "") + item = s; + else + item = "GMJ не отвечает на запрос. Проверьте интернет-соединение"; + + // Отображение + // Добавление в главное окно + if ((MainText.Text.Length + item.Length > ProgramDescription.MasterLogMaxLength) && + (MainText.Text.Length > item.Length)) // Бывает и так + MainText.Text = MainText.Text.Substring (item.Length, MainText.Text.Length - item.Length); + if (MainText.Text.Length > 0) + MainText.AppendText (RDLocale.RNRN + RDLocale.RN); + + // Добавление и форматирование + MainText.AppendText (item.Replace (NotificationsSet.MainLogItemSplitter.ToString (), RDLocale.RN)); + MainText.AppendText (RDLocale.RN); + } + + // Изменение размера шрифта + private void FontSizeField_ValueChanged (object sender, EventArgs e) + { + MainText.Font = new Font (MainText.Font.FontFamily, (float)FontSizeField.Value); + RDGenerics.SetSettings (fontSizePar, (uint)(FontSizeField.Value * 10.0m)); + } + private const string fontSizePar = "FontSize"; + } + } diff --git a/src/GrammarMustJoyProgram.cs b/src/GrammarMustJoyProgram.cs new file mode 100644 index 0000000..45994b8 --- /dev/null +++ b/src/GrammarMustJoyProgram.cs @@ -0,0 +1,42 @@ +using System; +using System.Windows.Forms; + +namespace RD_AAOW + { + /// + /// Класс описывает точку входа приложения + /// + public static class UniNotifierProgram + { + /// + /// Главная точка входа для приложения + /// + [STAThread] + public static void Main (string[] args) + { + // Инициализация + Application.EnableVisualStyles (); + Application.SetCompatibleTextRenderingDefault (false); + + // Язык интерфейса и контроль XPUN + if (!RDLocale.IsXPUNClassAcceptable) + return; + + // Проверка запуска единственной копии + if (!RDGenerics.IsAppInstanceUnique (true)) + return; + + // Контроль прав + if (!RDGenerics.AppHasAccessRights (true, false)) + return; + + // Отображение справки и запроса на принятие Политики + if (!RDGenerics.AcceptEULA ()) + return; + RDGenerics.ShowAbout (true); + + // Запуск + Application.Run (new GrammarMustJoyForm ((args.Length > 0) && (args[0] == "-h"))); + } + } + } diff --git a/src/android/AboutPage.xaml b/src/android/AboutPage.xaml new file mode 100644 index 0000000..73df49e --- /dev/null +++ b/src/android/AboutPage.xaml @@ -0,0 +1,43 @@ + + + + + +