irssi/plan3.md

5.3 KiB

KOMPLEKSOWY PLAN IMPLEMENTACJI - NOWE PODEJŚCIE

WYTYCZNE OBOWIĄZKOWE:

  1. Zawsze pamiętaj kontekst: msg_flow.md i summary.md
  2. Nie zbaczaj z wyznaczonej ścieżki - trzymaj się planu
  3. Checkpoint commits: Po zmianach commit z pushem zawierający info o zmianach i timestamp (data + dokładna godzina)
  4. ZAKAZ ninja Build install - tylko build do sprawdzenia błędów kompilacji

ANALIZA PROBLEMU

KLUCZOWA OBSERWACJA: Po analizie msg_flow.md i summary.md widzę, że:

  1. parse_special + ALIGN_COMBINE_MODE - już próbowane, problem z kolorami
  2. Expandos - nie mają dostępu do arglist, zwracają puste stringi
  3. NOWE ROZWIĄZANIE: Modyfikacja na poziomie format_get_text_args (krok 10 w flow)

STRATEGIA: INTEGRACJA Z ARGUMENTAMI FORMATOWANIA

KLUCZOWA IDEA:

Zamiast modyfikować parse_special lub tworzyć expandos, wstrzykniemy dodatkowy parametr padding bezpośrednio do arglist w format_get_text_args().

PLAN IMPLEMENTACJI

FAZA 1: Przygotowanie Infrastruktury

1.1 Dodanie ustawień konfiguracyjnych

Plik: src/fe-common/core/fe-settings.c

// Dodać do settings_add_*():
settings_add_bool("lookandfeel", "nick_column_enabled", FALSE);
settings_add_int("lookandfeel", "nick_column_width", 12);

1.2 Dodanie flag do TEXT_DEST_REC

Plik: src/fe-common/core/printtext.h

typedef struct {
    // ... istniejące pola
    int flags;  // nowe pole dla flag formatowania
} TEXT_DEST_REC;

#define PRINT_FLAG_NICK_COLUMN 0x01

FAZA 2: Modyfikacja Flow Formatowania

2.1 Ustawienie flagi w obsłudze wiadomości

Plik: src/fe-common/core/fe-messages.c

W funkcjach sig_message_public() i sig_message_own_public():

// Po utworzeniu dest przez format_create_dest()
if (settings_get_bool("nick_column_enabled")) {
    dest.flags |= PRINT_FLAG_NICK_COLUMN;
}

2.2 Główna logika w format_get_text_args

Plik: src/fe-common/core/formats.c

W funkcji format_get_text_args() (krok 10 flow), PRZED pętlą parsowania:

// Sprawdź czy nick column jest włączony
if (dest && (dest->flags & PRINT_FLAG_NICK_COLUMN)) {
    // Znajdź parametry mode i nick w arglist
    char *mode = NULL, *nick = NULL;
    
    // Dla TXT_PUBMSG: args[0]=nick, args[3]=nickmode
    // Dla TXT_OWN_MSG: args[0]=nick, args[3]=nickmode
    if (args && args[0] && args[3]) {
        nick = args[0];
        mode = args[3];
        
        // Oblicz padding
        int width = settings_get_int("nick_column_width");
        int mode_len = strlen(mode);
        int nick_len = strlen(nick);
        int total_len = mode_len + nick_len;
        
        if (total_len < width) {
            int padding_len = width - total_len;
            char *padding = g_strnfill(padding_len, ' ');
            
            // Wstrzyknij padding jako nowy parametr na początku
            // Przesuń wszystkie argumenty o 1 pozycję w prawo
            // args[0] = padding, args[1] = nick, args[4] = mode
            // Theme będzie używać: $0 (padding) + $4 (mode) + $1 (nick)
        }
    }
}

FAZA 3: Modyfikacja Theme

3.1 Aktualizacja abstracts w default.theme

# Gdy nick_column_enabled = ON, argumenty są przesunięte:
# $0 = padding (nowy)
# $1 = nick (przesunięty z $0) 
# $4 = mode (przesunięty z $3)

# Podstawowy abstract z padding
msgnick = "%K<%n$0%B$4%N%g$1%K>%n %|";

# Own messages
ownmsgnick = "{msgnick $0 $4 $1}";

# Public messages  
pubmsgnick = "{msgnick $0 $4 $1}";

FAZA 4: Testowanie i Debugowanie

4.1 Dodanie debug outputu

// W format_get_text_args() dodać:
if (settings_get_bool("debug_nick_column")) {
    printf("DEBUG: nick_column - padding='%s', mode='%s', nick='%s'\n", 
           padding, mode, nick);
}

4.2 Checkpoint commit

git add -A
git commit -m "[nick_column] FAZA 1-4: Infrastruktura + logika padding - 2025-01-24 15:30"
git push origin irssip

HARMONOGRAM IMPLEMENTACJI

Dzień 1: Infrastruktura

  • Dodanie ustawień (nick_column_enabled, nick_column_width)
  • Dodanie flag do TEXT_DEST_REC
  • Checkpoint commit

Dzień 2: Logika formatowania

  • Modyfikacja sig_message_public() i sig_message_own_public()
  • Implementacja logiki padding w format_get_text_args()
  • Checkpoint commit

Dzień 3: Theme i testowanie

  • Aktualizacja default.theme
  • Dodanie debug outputu
  • Build test (bez install)
  • Checkpoint commit

PRZEWIDYWANE WYZWANIA

1. Przesunięcie argumentów

Problem: Wstrzyknięcie padding przesuwa wszystkie argumenty Rozwiązanie: Dokładne mapowanie argumentów w theme

2. Kompatybilność wsteczna

Problem: Theme musi działać z wyłączonym nick_column Rozwiązanie: Warunki w theme lub osobne abstracts

3. Różne formaty wiadomości

Problem: TXT_PUBMSG, TXT_OWN_MSG, TXT_PUBMSG_HILIGHT mają różne argumenty Rozwiązanie: Mapowanie per format type

KRYTERIA SUKCESU

Wyrównanie działa - nicki wyrównane do prawej w kolumnie
Kolory zachowane - osobne kolory dla mode i nick
Konfigurowalność - szerokość przez ustawienia
Kompatybilność - działa z wyłączonym nick_column
Brak wpływu na resztę - standardowe formatowanie nietknięte